苹果和私人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的任何东西,你的应用程序仍然可以被拒绝。 一个例子可能是UIImagePickerControllercameraOverlayView (见这里 )。 这有点令人费解。

一般来说,他们没有从SDK头。 苹果的惯例之一是带领下面的ObjC方法名称。

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

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

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

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

被所谓的“使用私人API”拒绝是不难的。 尝试使用以下内容作为核心数据属性,它将被拒绝:

  • colorIndex
  • 发生
  • ID

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