【问题标题】:iOS How do I find Strings in Apple's private APIsiOS 如何在 Apple 的私有 API 中找到字符串
【发布时间】:2018-05-06 10:26:14
【问题描述】:

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

我正在寻找一种方法来使用 value(forProperty:) 访问 MPMediaItem 的隐藏字段,但我正在寻找的字符串不公开。我查看了MPMediaItem 标题here,但找不到我要找的东西,但这并不让我感到惊讶,因为在查看MPMediaPlaylist.h 时,我也找不到有关“parentPersistentID”的任何信息或“isFolder”属性都可以通过value(forProperty: "isFolder") as Bool轻松访问

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

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

以下是公开可用的字符串

【问题讨论】:

    标签: ios mpmediaitem


    【解决方案1】:

    我认为此时您确实需要重新考虑您的应用程序。 我认为人们永远不应该使用私有 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]);
    }
    

    【讨论】:

    • 不显示任何内容,循环不开始
    • 循环没有开始?这可能意味着没有 Ivars
    • 请检查新编辑以获取答案。您也可以对方法使用相同的机制,但当然可以使用不同的功能。
    • 好的,它可以工作,但只打印公共字段,我检查了 MPMediaPlaylist 并没有显示字段“isFolder”,但可以通过 valueForProperty 方法访问它谢谢你的帮助:)
    • 问题在于它不是Objective-C属性,MPMediaItem 似乎有一个私有内部字典,您只能使用valueForProperty: 从中读取(valueForProperty: 与Objective-C,在 Objective-C 中你使用valueForKey:)。
    猜你喜欢
    • 2020-10-20
    • 2010-12-18
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多