寻找私有API调用_terminateWithStatus。

13

我刚刚收到了一封来自苹果的电子邮件,说明我的应用因为调用了_terminateWithStatus而被拒绝。我在应用程序中使用了几个框架,认为这可能是罪魁祸首。

我运行了otool,以下是输出结果:

/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 751.49.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 1400.0.0)
/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 600.0.0)
/System/Library/Frameworks/CoreData.framework/CoreData (compatibility version 1.0.0, current version 320.15.0)
/System/Library/Frameworks/MapKit.framework/MapKit (compatibility version 1.0.0, current version 14.0.0)
/System/Library/Frameworks/CFNetwork.framework/CFNetwork (compatibility version 1.0.0, current version 485.12.7)
/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration (compatibility version 1.0.0, current version 379.0.0)
/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices (compatibility version 1.0.0, current version 20.0.0)
/System/Library/Frameworks/CoreLocation.framework/CoreLocation (compatibility version 1.0.0, current version 370.3.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 150.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.4.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 550.52.0)

我还通过App Scanner运行了该应用程序,但输出中没有显示terminateWithStatus。

有人可以指点我在哪里找到它吗?我也看过一些关于使用nm和grep查找调用的讨论。提前感谢。

已解决:

在进入构建目录后:

AppName/build/AppName.build/Release-iphoneos/AppName.build/Objects-normal/armv6/ 

我运行了:

strings AppName | grep 'terminateWithStatus'

经过一番探究,我发现调用私有API的原因是测试框架GHUnit。我移除了这个框架,重新构建后再次运行相同的命令,没有返回任何结果。

希望这可以帮助到其他寻找私有API调用方法的人,这真是一次不太愉快的冒险之旅。


我遇到了同样的问题,而且我也用了和你一样的方法来解决它。谢谢。 - Mashhadi
3
谢谢提供信息。我遇到了相同的问题。我可以使用字符串 "AppName | grep 'setUploadFileUrl:'" 显示结果,但无法找到使用这个方法的框架。你能建议我如何继续吗? - user2931321
1个回答

9
你需要在可执行文件上运行otool,而不是在应用程序包装器上运行。
例如(对于格式奇怪的抱歉):
$ otool -L WriteRoom.app/Contents/MacOS/WriteRoom 

WriteRoom.app/Contents/MacOS/WriteRoom (architecture ppc):
    @executable_path/../Frameworks/Blocks.framework/Versions/A/Blocks (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 11.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.3)

WriteRoom.app/Contents/MacOS/WriteRoom (architecture i386):
    @executable_path/../Frameworks/Blocks.framework/Versions/A/Blocks (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 11.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.3)

谢谢Chris,结果发现可执行文件被埋在构建文件夹里。已添加上面的输出。不过还在寻找调用。 - iOSDevSF
我不知道你能否在字符串中找到它。也许是nm输出?或者尝试请求Apple给你一个调用堆栈跟踪? - Chris Cleeland
我在我的.app文件中无法获取文件夹内容。 - Mashhadi
otool是一种标准的开发工具,或者至少曾经是。 "man otool"是你的好朋友。 “我在我的.app文件中没有获取文件夹内容”这句话对我来说毫无意义。 - Chris Cleeland
ChrisCleeland,感谢提供信息。我认为@Mashhadi没有找到你提到的路径。他只需要检查应用程序包的内容并找到可执行文件即可。对于iOS应用程序而言,仅需使用otool -L WriteRoom.app/WriteRoom命令即可。 - Julio Bailon

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