如何检测和避免第三方库中使用私有API

10

现在苹果正在运行某种静态分析来自动检查私有API的使用情况,由于Three20库,一些人已经被抓住了。我使用另一个第三方库(我从代码中自己编译),我希望在提交给苹果之前自动审核它的私有API使用情况,以便我可以消除/重写那些部分。

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

然而:如果我故意包含对私有API的调用,它不会出现在nm的输出中,但它会出现在二进制文件上运行 strings命令的输出中。基于此,我想到了一个想法,即编译一个所有私有API调用的大表格,并自动在字符串输出中搜索它们。我还没有做到这一点。

有人有任何提示可以自动捕捉这些内容,以便我只需要经过一次审核过程吗?


他们反对Three20吗?实际上,那是由为iPhone创建Facebook应用程序的开发人员编写的。如果您的应用程序因为Three20而被拒绝,那么Facebook应用程序也应该被拒绝... 嘿,只是说说而已;-) - Ben Gotow
是的...http://groups.google.com/group/three20/browse_thread/thread/c442af6e39a918b0/6d5046771539d139 - Simon Woodside
1
我想象下一次Facebook提交更新,如果他们不使用符合苹果政策的最新版本,那么他们将被拒绝。 - bpapa
2个回答

6

您可以尝试在目标文件上运行 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实例变量。

项目已经死亡,并没有发布版本。 - William Entriken

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