苹果机的自动化(自动化测试、自动化获取信息等等)基本上都要借助于工具Instruments。


Instruments是一个工具集,包括检测内存泄露、运行速度、耗电情况、自动化等功能,参考下图:


苹果自动化之重签名_java


对于发布到appstore的app,都是使用发布证书来签名。对于这种app不能直接使用Instruments来做自动化操作,因为启动不了目标应用(会提示签名问题)。


重签名是解决这个问题的一个办法。


本文介绍如何通过重签名的办法,最终让Instruments可以启动目标app。


(一)从问题开始

随便在appstore上下载一个app,再通过itunes导出ipa。把这个ipa安装到手机,再通过mac上Instruments来启动,发现一启动就退出,并且有提示,大概为“不是开发者证书的签名”。

注意,不能直接在网上下ipa,因为网上的ipa很可能不是用发布证书签名的,或者已经重签名为开发者证书,所以不能验证问题。


(二)重签名的准备

(1)mobileprovision文件

重签名需要用到描述文件即provision文件,并保证keychain里面有对应的证书。

可以创建证书与provision,再安装到keychain。或者让别人发一个p12文件与对应的provision,再双击安装。


(2)plist文件

重签名时要使用一个entitlements.plist 文件,可以直接找一个这样的文件来修改,保证get-task-allow字段为true即可。

也可以plistbuddy工具来生成一个plist:

/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i xxx.app/embedded.mobileprovision) > entitlements.plist   


/usr/libexec/PlistBuddy -c 'Set :get-task-allow true' entitlements.plist  


xxx.app换成目标app,并且要cd到目标ipa的Payload目录再进行操作


(三)重签名

使用codesigh进行签名:

cp "xxx.mobileprovision" "Payload/xxx.app/embedded.mobileprovision" 

--使用mobileprovision文件,覆盖app原有的(没有也照样拷贝过去)


/usr/bin/codesign -f -s "iPhone Developer: xxx (yyy)" --entitlements "Payload/entitlements.plist" "Payload/xxx.app"  

--注意entitlements.plist要准备好


在codesign指定证书时,证书的名字(带括号、空格之类的),最好到keychain里面找到这个证书,然后右键在“简介”里面拷贝过去,避免“找不到”的提示。


把Payload压缩成ipa,注意不是Payload的上一级目录!


(四)试验成果

把压缩出来的ipa安装到手机,发现Instruments可以正常启动app(随便找一个检测功能来录制)。


(五)强化与提问


(1)instruments不能启动其它app,是正常的表现,因为它只能启动被授权了的app。


(2)为什么instruments不能启动指定的app,一启动手机就重启,instruments提示为webkit启用异常或不是正确的签名?

        可能原因一:这个app必须是恰当签名了的(包括重签名),因为只有正确的签名才能让instruments有权限去控制这个app,也就是instruments须要使用特定的证书(在keychain中记录),而这个特定的证书被用来签名这个app。对于不是自己开发的app,则须要重签名这个app,再安装到手机。

        可能原因二:手机系统版本在9.0以下的,存在这个问题。只能更换更高的版本来解决。


(3)注意细节
  1. 最终压缩ipa时,是把Payload目录压缩,而不是它的上一级目录。

  2. 证书的名字最好是从“简介”里拷贝过去,避免对不上。

https://mp.weixin.qq.com/s/Cpu7QFFUalkd7YsGX0-T4Q