iPhone开发者社区的共识是,Apple最近开始使用静态代码分析工具来检测未记录的API调用的使用。
仅仅为了论证,我想知道是否可以通过在运行时生成调用来解决这个工具:
NSString *const aMethod = @"doStuff:withStuff:";
SEL aSelector = NSSelectorFromString(aMethod);
NSMethodSignature *aSignature = [targetObject methodSignatureForSelector:aSelector];
NSInvokation *anInvokation = [NSInvokation invocationWithMethodSignature:aSignature];
[anInvokation setTarget:targetObject];
[anInvokation setSelector:aSelector];
[anInvokation setArgument:&firstArg atIndex:2];
[anInvokation setArgument:&secondArg atIndex:3];
[anInvokation invoke];
这几乎看起来太容易了,所以我想知道 - 我错过了什么? Apple如何使用程序集上的静态代码分析检测到这一点?
有几点:
答案 0 :(得分:4)
为何关心?您不应该使用私有API有充分理由:Apple可能会随时轻易破坏您的应用程序,从而使您的用户感到不安。
也就是说,使用NSInvocation,-performSelector:或任何其他类似的技术可能足以避免静态分析器的检测。
答案 1 :(得分:2)
我想你已经读过this article了。同样有趣的是this one。我的解释是,Apple的静态分析器确实会产生误报,因为有些人使用与私有方法同名的方法。如果分析器已完成运行时分析或彻底检查已调用哪些类的选择器,则不会发生这种情况。所以,看起来他们主要是在二进制文件中寻找匹配的字符串或选择器。我认为使用NSInvocation
结合一些字符串混淆会让你通过。不过,我仍然建议不要依赖私有API。
答案 2 :(得分:1)
有一种简单的方法可以找到答案!
制作一个应用程序,通过您问题中的方法故意使用隐藏的api,如果被接受,请查看它!
萨姆
PS如果你确实发现了,请务必告诉我们;我们都很想知道,Apple肯定不会告诉我们!