一、背景介绍
最近新版本审核时被拒了,Apple给出的原因是使用到了Intents的功能,但是Info.plist中并未给出使用简介导致被拒。由于我们的App并不需要使用Intents等能力,所以需要排查是哪些第三方库引入的Intents.framework。下面将介绍在分析二进制文件时常用的一些命令,帮助我们快速定位问题。
首先下载jenkins打好包的IPA文件,修改ipa后缀为zip并解压,在命令行中cd 进入/Payload/TestProject.app(这里重命名为TestProject)目录下,后续步骤见命令介绍
二、常用命令
1. otool
otool命令全称object file displaying tool,是针对目标文件的展示工具,可以帮助我们发现应用中使用了哪些系统库,以及调用了哪些对象的方法和属性。
常用的几个子命令如下:
otool -L path
//查看可执行程序都链接了那些库otool -L path | grep "xxx"
//筛选是否链接了xxx库otool -ov path
//输出Object-C类结构以及定义的方法
首先我们通过otool -L XXX命令可以确定安装包中是否包含了Intents相关的framework,通过结果可以确定的确是链接了相关库导致命中了Apple的审核扫描
2. lipo
lipo命令的作用是create or operate on universal files,即创建或处理通用文件的工具。
常用的几个子命令如下:
lipo -info XXX
// 判断静态库所支持的平台 armv7 x86_64 arm64lipo -remove armv7 origin_xxx.a -output op_xxx.a
// 删除静态库包括的armv7平台lipo -thin arm64 origin_xxx.a -output op_xxx.a
// 拆分静态库,只保留arm64 CPU架构lipo -create device_xxx.a simulator_xxx.a -output universal_xxx.a
//对真机或者模拟器分别打出 .a 文件合并
接下来我们就需要用到lipo命令了,由于我们打包的MachO文件都是fat file,包含了armv7和arm64,所以搜索信息时会出现重复两份的情况。为了方便排查,我们将从MachO文件单独拆分出arm64架构。
3. nm
nm命令的作用是显示符号表,常用的几个子命令如下:
nm path
//得到Mach-O中的程序符号表nm -nm path
//目标文件的所有符号nm -u path
//Display only undefined symbols.
这里我们直接用nm命令找到Intents相关framework的引用符号表,由于是外部framework,所以符号都是undefined。
通过nm命令可以看到macho文件中因为引用了INPreferences和INUIEditVoiceShortcutViewController等符号导致间接引入了Intents.framework和IntentsUI.framework,下面我们通过otool命令导出macho文件中的OC信息来辅助排查是哪些类引入了这几个符号。
在命令行在使用otool -ov XXX导出OC相关的类结构和相关方法到本地。
接下来用Sublime等软件打开刚才导出的ov.txt文件,搜索INUIEditVoiceShortcutViewController,可以看到是某个第三方库的类引入了相关代码导致引入了该符号,注释掉相关代码可解决。
搜索INPreferences时,发现是以OBJC_CLASS$_INPreferences的关键字引入的,在Xcode中搜索INPreferences,发现某个第三方库的类中调用了INPreferences的requestSiriAuthorization方法导致引入了该符号。代码示例如下:
1 | if (@available(iOS 10.0, *)) { |
通过以上的命令和步骤便可定位解决Intents.framework和IntentsUI.framework引入的问题,避免审核再次被拒。
4. strings
最后介绍一下strings命令,它可以帮助我们排查二进制文件中是否包含相关字符串,常用的命令为:
strings XXX | grep yourString
在打包生成的MachO文件中,我们的类名、方法名都会以字符串明文的形式存储到MachO文件中,我们可以通过grep requestSiriAuthorization:来确定是否走了[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) { }];
方法。
修改完上述检测到的代码,重新打包验证,最终结果没有Intents相关的framework,问题解决。
三、总结
我是直接用IPA包进行的分析,你也可以利用上述命令封装成脚本,对工程中的所有.a遍历检查,定位是哪个第三方库引用的不合法符号,也是一种解决思路。
以上就是我们在分析二进制文件时常用的命令,这里做个总结,方便我们有相关需求时可以通过otool/nm/strings等命令快速自查,解决问题。
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章