【问题标题】:Apple and private APIsApple 和私有 API
【发布时间】:2010-12-18 22:04:04
【问题描述】:

既然公众都知道 App Store 提交的内容正在测试是否使用私有 API,我需要问一个问题......私有 API 到底是什么,以便我可以避免它们?

【问题讨论】:

    标签: ios iphone iphone-privateapi


    【解决方案1】:

    私有 API 是 SDK 中未记录的 API。例如,一个框架类可能声明了一个不打算供外部开发人员使用的方法。不保证私有 API 的行为。您甚至无法确定该方法是否会在平台的未来更新中出现。它的声明可能在公开分发的 SDK 头文件中不可用。如果您坚持 SDK 文档中公开定义的内容,就可以了。

    【讨论】:

    • 因此,与其在私有 API 中调用方法,不如创建自己的方法来做同样的事情,这有什么区别?我是否正确地说这不是调用某些 API 方法的问题,而是你试图做他们不希望你做的事情的事实?
    • @Nick 不一定。要获得 Apple 批准的应用程序,您应该具备以下两个条件: 1. 只做他们没有限制您的事情,无论采用何种方法。 2. 通过有效的机制进行。一般来说,有些事情是可以做的,但你不能直接调用私有 API 来完成它们。惯例是私有 API 可能会在未来的版本中更改并破坏您的应用程序,而在公共 API 上编写自定义方法不应该随着 iOS 升级而中断。
    【解决方案2】:

    您会偶然发现很难使用私有 API。它们没有记录在 SDK 文档中,也没有出现在 XCode 的代码完成建议中。

    最近这成为新闻的原因是多个应用程序使用的框架的创建者使用了私有 API,因此当包含他的框架的开发人员更新他们的应用程序时,他们被拒绝(即使这些开发人员没有使用私有 API API,他们添加到应用程序中的框架)。

    这是您可能意外使用私有 API 的唯一方法。

    【讨论】:

    • 是在three20框架下,但是问题早就解决了。这个答案已经有两年多了。
    【解决方案3】:

    不仅仅是私有 API 会导致您的应用程序被拒绝。使用公共 API 的未记录成员可能会导致您的应用程序被拒绝。例如,three20 库(自修复以来)访问了一个类别中的 _phase 和 UITouch 的其他成员。

    他们还可以通过 performSelector 检测到对 private 成员的调用,因为以下也标记了拒绝:

    UIWindow* window = [UIApplication sharedApplication].keyWindow]
    return !![window performSelector:@selector(firstResponder)];
    

    更令人不安的是,如果您让您的应用程序在 3.1 和 3.0 下运行,并且在 3.0 运行时您不使用任何 3.1 的东西,您的应用程序仍然会被拒绝。一个例子可能是UIImagePickerControllercameraOverlayView(参见here)。这有点令人费解。

    【讨论】:

      【解决方案4】:

      通常是因为它们没有出现在 SDK 标头中。 Apple 的约定之一是使用下划线引导 ObjC 方法名称。

      【讨论】:

        【解决方案5】:

        在提交应用之前使用的一个很好的工具是 App Scanner。它会扫描您的 .app 文件以了解私有 API 的使用情况,并向您显示匹配的方法签名以及这些方法所在的类。

        链接 --> http://www.chimpstudios.com/appscanner/

        【讨论】:

        • 看起来此站点已关闭。任何人都知道执行类似功能的任何其他应用程序吗?
        【解决方案6】:

        我的应用因使用私有 API 而被苹果拒绝。这是代码,

            Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl");
        
            id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)];
        
            [activeInstance performSelector:@selector(dismissKeyboard)];
        

        【讨论】:

          【解决方案7】:

          被所谓的“使用私有API”拒绝并不难。尝试使用以下作为核心数据属性,它会被拒绝:

          • 颜色索引
          • 出现
          • 身份证

          它显示了机器人如何扫描 API。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-20
            • 2011-02-09
            • 1970-01-01
            • 1970-01-01
            • 2012-05-07
            • 2013-10-17
            • 1970-01-01
            相关资源
            最近更新 更多