不少 app 可能都有自动化测试的需求,尤其是规模起来后,大批量自动化测试可以减少很多机械化的人工测试成本,也能及时的查出一些比较关键的问题,可是基于 Xcode 的模拟器独占的特性,利用 Mac 集群测试不是一个比较合适的方案,另外通过 Debug 打出的包也不一定是和线上相一致的,所以利用 Release 包 + 多台 iOS 设备进行的自动化测试相对比较靠谱。
只不过,利用 Xcode 中 Instruments
的 UIAutomation
却有一个比较致命的限制:
The app must be signed with a development identity (e.g. iOS Developer).
这就很尴尬了,怎么办?既然他说只能用 development 证书来签名,那我们第一个想到的可能就是重签。
原理
我们可以通过对 .ipa
分析来看看到底是哪里控制着 Instruments
的访问权限的
一般来说,App 的权限和设定都放在了包里面的描述文件中,也就是 xxx.app
里面的 embedded.mobileprovision
果不其然,里面有一个 get-task-allow
的 key,它的值是 false
,通过查证,果然是用于控制其他进程的访问权限的,并且正如上面返回的信息,这个值只有通过 development 证书来签名的时候才会是 true
。
解决方案
其实步骤比较简单
- 自己重新生成用于签名的
Provisioning Profile
,如果 App 里面有多个 target,还需要一一对应生成多个,Bundle ID
一定要设置好并且有别于原来的,并且不能一样,extension
的一定要是所依附 App 下的 ID,例如主 ID 为com.ming.app
,那么extension
一定要是com.ming.app.xxx
- 将
Entitlements
提取出来,并且用新的 PP 文件替换掉原有的 - 更改 App 的
Bundle ID
为刚刚生成的 PP 文件所对应的,依旧,如果有多个 target ,还是要一一对应的替换掉 - 去掉原有的签名,重新签名
- 打包,安装
哈哈,是不是看完后感觉好抽象,有些同学已经打开了 Google 准备开始搜索具体怎么做了吧?
好在我们有个大杀器—— fastlane 下的 sigh 工具
这是鼎鼎大名的 iOS 开发工具链 Fastlane 旗下的一个小工具,用于管理开发者账号下面的证书,PP 以及修复 App 的 PP 文件,签名和重签名……总之就是个神器。我们在这里只用到它里面的 resign
首先我们做下准备工作
- 因为它是个基于
Ruby
的工具链,所以,你需要有个Ruby
环境(Xcode 现在已经提供Ruby 2.0.0
,不过作为 iOS 开发,想必你已经有更高版本的Ruby
了吧?) - 安装它
sudo gem install sigh
,当然了,为了能正常的安装,你还要确保你的Xcode Command Line Tools
已经安装好了:xcode-select --install
- 然后将你准备重签名的 App 和你刚才生成的 PP 文件放到一起,然后执行
sigh resign ./path/app.ipa --signing_identity "iPhone Developer: XXX" -p com.you.BundleID=my.mobileprovision
,记着替换掉里面的信息为自己的,如果有多个 target ,只需要在后面追加-p
就行了。 - 回车,搞定
安装
生成 .ipa
后,就是要安装到手机上了,比较简单的方法就是通过 Xcode
连上 iOS 设备,打开 Xcode,在顶部菜单栏找到 Window
下面的 Devices
,选中你的设备,会在右侧有个非 App Store 的 App 列表,下面有个 + 号,点击它就能安装
另外还有个通过 iTunes 的安装方式,大同小异,和正常的同步操作一致,就不赘述了
自动化前的验证
安装完后可以到设置中的开发者里面看看 UIAutomation 是否打开了
然后去启动下 App 看看能用么,iOS 9以上的系统还会让你去描述文件中认证下
小结
这个不仅解决了 Release 包真机自动化测试的问题,也给我们提供了一个比较好的重签名思路
用这个工具还能做好多事情,好奇的同学可以去研究下