【问题标题】:How to detect & avoid the use of private APIs in third party libraries如何检测和避免在第三方库中使用私有 API
【发布时间】:2009-12-08 00:13:16
【问题描述】:

现在,Apple 正在运行某种静态分析来自动检查私有 API 的使用,许多人因为 Three20 库而被捕。我使用另一个第三方库(我自己从代码编译),我想在提交给 Apple 之前自动审核它以供私有 API 使用,这样我就可以消除/重写这些部分。

如果我在我的应用程序可执行文件上运行nm,我会得到一个符号列表,并且我会在其中看到我不使用的符号。例如,我看到 _AudioServicesPlaySystemSound,如果我在 XCode 中搜索“AudioServicesPlaySystemSound”,我没有得到任何结果。有什么方法可以自动区分对私有 API 的调用,例如我注意到 Apple 习惯用初始下划线命名它们。

但是:如果我故意包含对私有 API 的调用,它不会出现在 nm 的输出中,但如果我在二进制文件上运行 strings,它确实会出现。基于此,我的一个想法是将所有私有 API 调用的巨大列表编译成一个巨大的表,并在字符串输出中自动搜索它们。我还没有这样做。

有没有人有任何关于如何自动捕捉这些东西的提示,所以我只经历一次审查过程?

【问题讨论】:

  • 他们反对 Three20?这实际上是由为 iPhone 创建 Facebook 应用程序的开发人员编写的。如果你的应用因为 Three20 而被拒绝,那 Facebook 应用应该也太……呵呵。只是说;-)
  • 我想下次 Facebook 提交更新时,如果他们不使用符合 Apple 政策的最新版本,他们会被拒绝。

标签: iphone iphone-privateapi


【解决方案1】:

您可以尝试在目标文件而不是链接的可执行文件上运行 nm:

nm -g -j *.o  | sort | uniq

对象应位于build/<app>.build/*/<app>.build/Objects-normal 子目录中。

您看到的是对AudioServicesPlaySystemSound 的引用,因为您调用的函数之一又调用了AudioServicesPlaySystemSound

Objective C 调用通常不会出现在 nm 转储中,您需要为此使用 otool

otool -ov <object file>

【讨论】:

    【解决方案2】:

    使用这个开发工具,App Scanner。它会扫描您的 .app 文件以查找私有 API 方法。未来版本还将检查私有 API 实例变量。

    【讨论】:

    • 项目已死,没有发布。
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 2020-04-19
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多