如何查找Apple私有API字符串?求访问MPMediaItem隐藏字段方法
我懂你这种找不到私有属性字符串的头疼——毕竟Apple不会把这些藏起来的字段写在公开头文件里。既然是测试用途,我给你几个可行的方向:
用class-dump导出完整头文件
Apple的公开头文件只会暴露官方允许使用的接口,而class-dump可以提取出框架里的所有属性和方法(包括私有部分)。针对MediaPlayer框架,你可以在终端运行以下命令:class-dump /System/Library/Frameworks/MediaPlayer.framework/MediaPlayer > MPMediaItem_full.h导出后打开生成的
MPMediaItem_full.h文件,搜索相关关键词,就能找到那些隐藏的property对应的字符串了。运行时遍历MPMediaItem的所有属性
利用Objective-C的运行时特性,你可以直接遍历MPMediaItem类的所有属性名,这样能直接拿到可用的property字符串。试试这段代码:#import <objc/runtime.h> unsigned int propertyCount; objc_property_t *properties = class_copyPropertyList([MPMediaItem class], &propertyCount); for (unsigned int i = 0; i < propertyCount; i++) { objc_property_t property = properties[i]; const char *propertyName = property_getName(property); NSLog(@"隐藏属性名:%s", propertyName); } free(properties);运行后控制台会输出所有属性名,包括私有字段,你可以从中找到需要的字符串,再用
value(forProperty:)方法去访问对应的值。参考同框架的私有属性命名规律
像你提到的MPMediaPlaylist的"parentPersistentID"和"isFolder"这类私有属性,命名风格通常和公开属性保持一致。比如MPMediaItem的公开属性有kMPMediaItemPropertyPersistentID,那私有字段可能会是类似"artistPersistentID"、"genrePersistentID"这类格式,你可以尝试这类命名去测试,说不定能命中目标字段。
注意:以上方法仅适用于测试场景,私有API在正式上线的App中绝对不能使用,会导致App被App Store拒绝审核。
内容的提问来源于stack exchange,提问作者Adam

