在工作中分发内测应用是经常遇见的,常见的方式有:TestFlight,用企业级开发者账号,搜集UDID打包等方式,每种方式都各有利弊。
由于公司有企业级开发者账号,所以平常应用内测比较简单:直接拿企业级账号打包.ipa,将.ipa发布到内测平台(比如蒲公英,fir.im),测试人员直接下载安装就可,只是第一次需要信任一下企业级证书。
在工作中,有时候我们需要分发某个app的.ipa包,并没有改app的源码,无法用自己的账号打包。这时就用到了重签名。
其实ipa重签名的应用场景很多,比如App Store上的付费应用,可以使用自己的开发者账号,其.ipa包重新签名,就可以安装了。各大app助手平台就是这么做的。注意直接从App Store下载的应用是加壳的,无法直接重新签名,必须砸壳。iOSRE逆向
iReSign
iReSign是一个重签名工具
操作步骤:
- 选择.ipa包的路径
- 选择
embedded.mobileprovision
文件路径。embedded.mobileprovision
是用于打包的配置文件Provisioning Profiles
。可以直接在Certificates, Identifiers & Profiles
中下载,注意下载之后需要将名字设置为embedded.mobileprovision
。也可以在之前用该文件打包过的.ipa中找:解压.ipa -> Payload -> xx.app显示包内容 ->embedded.mobileprovision
- 网上有资料说entitlements.plist不需要填写。我试过不填写或填写,我按照本文iOS证书及ipa包重签名探究的方式写的.plist文件。
- 选中修改ID,填写修改的appid
- 选择证书,下拉列表会显示mac上有的证书。
- 点击重新签名!
结果是失败了。
错误信息如下,可以查看该错误的IResign上的issues
1 | [General] Error Domain=NSCocoaErrorDomain Code=3840 "Unexpected character s at line 1" UserInfo={NSDebugDescription=Unexpected character s at line 1, kCFPropertyListOldStyleParsingError=Error Domain=NSCocoaErrorDomain Code=3840 "Unexpected ';' or '=' after key at line 1" UserInfo={NSDebugDescription=Unexpected ';' or '=' after key at line 1}} |
另外还有一个重签名工具:ios-app-signer
实践篇:iOS 应用重签名(上)这篇文章介绍了entitlement文件如何写,ios-app-signer的使用。我没有测试该方法是否可行。
使用sigh脚本
在iReSign失败后,我在网上找到使用sigh脚本的方式来重签名。
- 安装神器brew,没有安装的看这里:Homebrew
- 安装ruby,命令:
brew install ruby
- 安装sigh,命令:
sudo gem install sigh
,过程比较漫长。
安装sigh脚本后,开始进行重签名,步骤如下
- 在终端输入
sigh resign
,回车 - 把要签名的ipa文件拖到窗口上,回车
- 填写用来签名的证书名,回车
- 把项目的配置文件embedded.mobileprovision文件拖到窗口上,回车
- 好了,resign脚本会自动更改bundel id,签名并重新打包。
注意ipa包名不要有中文。如果应用有多个targetes无法用上述方式重签名。参考文章:iOS的ipa重签名
我按照如上步骤操作,成功使用企业级证书打包,上传到蒲公英内测平台上,也显示的是企业级应用,但是无法安装,提醒无法下载app,我手机上没有从App Store上下载安装该应用,排除了无法覆盖问题。
iOS9以后,企业级应用不会出现信任按钮,如果ipa包和网页的bundle ID
不匹配,就无法安装。在iOS9之前是没有检测的。详情见大神iOS程序犭袁的文章ios9适配系列教程
我操作成功的办法
经过了无数次测试sigh脚本签名方式,最后即将放弃的时刻成功了。
- 将需要重签的.ipa文件和
embedded.mobileprovision
配置文件放到同一个文件夹下。注意路径和文件名中不要出现中文,配置文件名一定要是embedded
。 - 在终端中cd到该路径下
- 使用sigh脚本:
sigh resign
回车,运行结果跟上面是不一样的,会直接出现Signing Identity:
让我填证书名。上述方式应该是第二步拖ipa文件到窗口,Path to ipa file:
- 在
Signing Identity:
上面会出现一串可用的identity
,这里要输入这些identity
的十六进制串。回车 - 成功了:
Successfully signed 路径/xxx.ipa!
原来文件夹中的.ipa已经被重签名了。上传到蒲公英内测平台,完全可以下载使用。
本文涉及到的知识点都是从网上Google的,感谢网友们分享的资料,还涉及的一些参考资料: