苹果和私人API
现在公众知道App Store提交的内容正在使用私有API进行testing,所以我需要提出这个问题…究竟是一个私有API,以便我可以避免它们?
私有API是SDK中未logging的API。 例如,框架类可能会声明一个不打算被外部开发人员使用的方法。 私有API的行为不能保证。 您甚至不能确定该方法将在平台的未来更新中出现。 它的声明可能在公开发布的SDK头文件中不可用。 如果你坚持在SDK文档中公开定义的东西,你会没事的。
您会发现偶然使用私有API很困难。 它们没有logging在SDK文档中,并且不会在XCode的代码完成build议中显示出来。
最近成为新闻的原因是几个应用程序使用私有API的框架的创build者,所以当包括他的框架的开发人员更新他们的应用程序时,他们被拒绝(尽pipeTHOSE开发者没有使用私有API,他们添加到他们的应用程序框架呢)。
这是您可能偶然使用私有API的唯一方法。
这不只是私人的API,可能会导致您的应用程序被拒绝。 使用公开API的未公开成员可能会导致您的应用程序被拒绝。 例如,three20库(自固定)访问_phase和UITouch的其他成员在一个类别。
他们还可以通过performSelector来检测对私人成员的呼叫,因为以下内容也标记为拒绝:
UIWindow* window = [UIApplication sharedApplication].keyWindow] return !![window performSelector:@selector(firstResponder)];
更令人不安的是,如果你使你的应用程序在3.1和3.0下工作,在3.0的运行时你不使用3.1的任何东西,你的应用程序仍然可以被拒绝。 一个例子可能是UIImagePickerController
的cameraOverlayView
(见这里 )。 这有点令人费解。
一般来说,他们没有从SDK头。 苹果的惯例之一是带领下面的ObjC方法名称。
应用程序扫描器是提交您的应用程序之前使用的一个很好的工具。 它会扫描您的.app文件中的私有API使用情况,并向您显示哪些方法签名匹配以及这些方法在哪些类中。
我的应用程序因为使用私有API而被苹果拒绝了。这里是代码,
Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl"); id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)]; [activeInstance performSelector:@selector(dismissKeyboard)];
被所谓的“使用私人API”拒绝是不难的。 尝试使用以下内容作为核心数据属性,它将被拒绝:
- colorIndex
- 发生
- ID
它显示了机器人如何扫描API。