利用重签名实现真机自动化测试

不少 app 可能都有自动化测试的需求,尤其是规模起来后,大批量自动化测试可以减少很多机械化的人工测试成本,也能及时的查出一些比较关键的问题,可是基于 Xcode 的模拟器独占的特性,利用 Mac 集群测试不是一个比较合适的方案,另外通过 Debug 打出的包也不一定是和线上相一致的,所以利用 Release 包 + 多台 iOS 设备进行的自动化测试相对比较靠谱。

只不过,利用 Xcode 中 InstrumentsUIAutomation 却有一个比较致命的限制:

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

解决方案

其实步骤比较简单

  1. 自己重新生成用于签名的 Provisioning Profile,如果 App 里面有多个 target,还需要一一对应生成多个,Bundle ID 一定要设置好并且有别于原来的,并且不能一样,extension 的一定要是所依附 App 下的 ID,例如主 ID 为 com.ming.app,那么 extension 一定要是 com.ming.app.xxx
  2. Entitlements 提取出来,并且用新的 PP 文件替换掉原有的
  3. 更改 App 的 Bundle ID 为刚刚生成的 PP 文件所对应的,依旧,如果有多个 target ,还是要一一对应的替换掉
  4. 去掉原有的签名,重新签名
  5. 打包,安装

哈哈,是不是看完后感觉好抽象,有些同学已经打开了 Google 准备开始搜索具体怎么做了吧?

好在我们有个大杀器—— fastlane 下的 sigh 工具

这是鼎鼎大名的 iOS 开发工具链 Fastlane 旗下的一个小工具,用于管理开发者账号下面的证书,PP 以及修复 App 的 PP 文件,签名和重签名……总之就是个神器。我们在这里只用到它里面的 resign

首先我们做下准备工作

  1. 因为它是个基于 Ruby 的工具链,所以,你需要有个 Ruby 环境(Xcode 现在已经提供 Ruby 2.0.0,不过作为 iOS 开发,想必你已经有更高版本的 Ruby 了吧?)
  2. 安装它 sudo gem install sigh ,当然了,为了能正常的安装,你还要确保你的 Xcode Command Line Tools 已经安装好了:xcode-select --install
  3. 然后将你准备重签名的 App 和你刚才生成的 PP 文件放到一起,然后执行 sigh resign ./path/app.ipa --signing_identity "iPhone Developer: XXX" -p com.you.BundleID=my.mobileprovision ,记着替换掉里面的信息为自己的,如果有多个 target ,只需要在后面追加 -p 就行了。
  4. 回车,搞定

安装

生成 .ipa 后,就是要安装到手机上了,比较简单的方法就是通过 Xcode

连上 iOS 设备,打开 Xcode,在顶部菜单栏找到 Window 下面的 Devices,选中你的设备,会在右侧有个非 App Store 的 App 列表,下面有个 + 号,点击它就能安装

Xcode_install

另外还有个通过 iTunes 的安装方式,大同小异,和正常的同步操作一致,就不赘述了

自动化前的验证

安装完后可以到设置中的开发者里面看看 UIAutomation 是否打开了

Settings

然后去启动下 App 看看能用么,iOS 9以上的系统还会让你去描述文件中认证下

小结

这个不仅解决了 Release 包真机自动化测试的问题,也给我们提供了一个比较好的重签名思路

用这个工具还能做好多事情,好奇的同学可以去研究下