Apple如何知道您正在使用私有API?

Tat*_*tat 109 iphone objective-c appstore-approval

我向Apple提交了一个没有任何源代码的二进制文件.

除了手动检查源代码外,Apple如何知道使用了什么以及您调用了哪些API?

ken*_*ytm 171

我知道有三种方法.这些只是一些猜测,因为我不在Apple审核小组工作.

1. otool -L

这将列出应用已链接到的所有库.你不应该使用的东西,比如IOKit和WebKit都可以被这个检测到.

2. nm -u

这将列出所有链接的符号.这可以检测到

  • 未记载的C函数,例如_UIImageWithName;
  • Objective-C类,如UIProgressHUD
  • 像这样的Ivars UITouch._phase(这可能是几个月来拒绝基于Three20的应用程序的原因.)

3.列出Objective-C选择器,或 strings

Objective-C选择器存储在二进制文件的特殊区域中,因此Apple可以从那里提取内容,并检查是否使用了一些未记录的Objective-C方法,例如-[UIDevice setOrientation:].

由于选择器独立于您正在发送的类,即使您的自定义类定义-setOrientation:与UIDevice无关,也有可能被拒绝.


您可以使用Erica Sadun的APIKit来检测由于(错误警报)私有API而导致的潜在拒绝.


(如果你真的真的想要解决这些检查,你可以使用运行时功能,如

  • dlopen,dlsym
  • objc_getClass,sel_registerName,objc_msgSend
  • -valueForKey:; object_getInstanceVariable,object_getIvar等.

获得那些私有库,类,方法和ivars.)

  • 您对otool执行什么操作?.app文件? (2认同)

Rob*_*ond 26

您可以在终端中使用以下单行程列出Mach-O程序中的选择器:

otool -s __TEXT __objc_methname "$1" |expand -8 | cut -c17- | sed -n '3,$p' | perl -n -e 'print join("\n",split(/\x00/,scalar reverse (reverse unpack("(a4)*",pack("(H8)*",split(/\s/,$_))))))'
Run Code Online (Sandbox Code Playgroud)


小智 12

假设你想使用一些私有API; objective C允许您从字符串构造任何SEL:

   SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
    [UIDevice performSelector:my_sel ...];
Run Code Online (Sandbox Code Playgroud)

机器人或图书馆扫描怎么能抓住这个?他们必须使用一些在运行时监视私有访问的工具来捕获它.即使他们构造了这样的运行时工具,也很难捕获,因为这个调用可能隐藏在一些很少运行的路径中.


Ale*_*lli 7

我想他们会查看你的二进制文件试图导入的所有符号(毫无疑问,这些符号在符号表中很容易获得),并且如果在"私有API列表"中找到任何这些符号,则会命令你.事实上,很容易实现自动化.