苹果和私有API

8

现在已经公开了App Store提交内容正在测试是否使用私有API,我需要问一个问题...什么是私有API,以便我可以避免使用它们?

7个回答

18

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


那么,与其调用私有API中的方法,您自己创建一个执行相同操作的方法有何不同呢?我说得对吗?问题不在于调用某些API方法,而在于您试图做一些他们不希望您做的事情,这才是关键。 - The Muffin Man
@Nick 不一定。为了让应用程序获得苹果的批准,您应该具备以下两个条件:1. 只要不违反限制,无论使用何种方法都可以实现。2. 通过有效的机制来实现。有些事情在一般情况下是可以做的,但是您不能直接调用私有API来完成它们。私有API的规则可能会在未来版本中更改并破坏您的应用程序,而在公共API上编写自定义方法不应该随着iOS升级而中断。 - Mehrdad Afshari

6

如果没有特意查找,你很难意外地使用私有API。它们在SDK文档中没有记录,并且不会出现在XCode的代码自动补全建议中。

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

这大概是唯一可能意外使用私有API的方式。


1
它出现在three20框架中,但问题早已得到解决。这个答案已经超过两年了。 - mmc

3
不仅私有API可能导致应用程序被拒绝,使用公共API的未记录成员也可能导致应用程序被拒绝。例如,three20库(已修复)在类别中访问了UITouch的_phase和其他成员。
他们还可以通过performSelector检测对私有成员的调用,下面的代码也会被拒绝:
UIWindow* window = [UIApplication sharedApplication].keyWindow]
return !![window performSelector:@selector(firstResponder)];

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

1

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

    Class UIKeyboardImpl = NSClassFromString(@"UIKeyboardImpl");

    id activeInstance = [UIKeyboardImpl performSelector:@selector(activeInstance)];

    [activeInstance performSelector:@selector(dismissKeyboard)];

1

通常是由于它们在SDK头文件中缺失。苹果的惯例之一是在ObjC方法名前加下划线。


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

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


看起来这个网站要么挂了。有人知道其他能提供类似功能的应用程序吗? - rvijay007

0

被所谓的“使用私有API”拒绝并不困难。尝试将以下内容用作Core Data属性,它将被拒绝:

  • colorIndex
  • occurrence
  • id

这展示了机器人如何扫描API。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接