首页 > 解决方案 > iOS 如何在 Apple 的私有 API 中找到字符串

问题描述

让我们跳过关于使用私有 API 的讨论,它只是为了测试一些东西。

我正在寻找一种MPMediaItem通过使用来访问隐藏字段的方法,value(forProperty:)但我正在寻找的字符串不公开。我在这里MPMediaItem查看了标题,但找不到我要找的东西,但这并不让我感到惊讶,因为在查看MPMediaPlaylist.h时,我也找不到任何关于 " " 或 " " 属性的信息,这两个属性都很容易访问者parentPersistentIDisFoldervalue(forProperty: "isFolder") as Bool

通常你会通过类似的方式访问播放列表的名称或其他字段value(forProperty: MPMediaPlaylistPropertyName),因为MPMediaPlaylistPropertyName它是公开可用的,MPMediaPlaylistPropertyIsFolder所以我们必须使用“ isFolder

是否有可能找到那些隐藏的字符串?我想知道猜测名称时是否是运气问题,或者是否有包含这些字符串的标题

以下是公开可用的字符串

在此处输入图像描述

标签: iosmpmediaitem

解决方案


我认为你真的需要在这一点上重新考虑你的应用程序。我认为永远不应该使用私有 API,它是出于某种目的而设为私有的。

但是这个 Objective-C 代码,可以显示私有变量:

unsigned int o;
Ivar *d = class_copyIvarList([MPMediaItem class], &o);
for(int i=0;i<o;i++) {
    NSLog(@"%@", [NSString stringWithCString:ivar_getName(d[i]) encoding:NSUTF8StringEncoding]);
}
free(d);

您可能还需要属性,有时会有computed属性(对不起,swifty 术语),这些属性也可能是私有的,您可能想知道它。

您也可以尝试添加以下内容:

objc_property_t *prop = class_copyPropertyList([something class], &l);
for (int i = 0; i < l; i++) {
    NSLog(@"%@", [NSString stringWithCString: property_getName(prop[i]) encoding:NSUTF8StringEncoding]);
}

推荐阅读