哪些场景需要我们自己动手去做重签名呢?举个例子,由于业务的需要,在不发布 AppStore 的情况,需要将自己的 APP 分发给外部企业用户使用,我们是不能把用我们自己企业证书打的包给到外部用户的,因为这违反了 AppStore 企业证书授权协议,一旦被苹果发现,那么这个企业下的所有 APP 可能都会被强制下架,并且永久封号。
iOS 重签名流程如下:
其实 iOS 的重签名很简单(文件路径自定义)步骤如下:
- 解压 ipa 安装包
unzip YiMa-Release.ipa
- 删除 app 原有签名
rm -rf Payload/YiMa.app/_CodeSignature/
- 替换证书配置文件
cp YiMa_production_provision_profile.mobileprovision Payload/YiMa.app/embedded.mobileprovision
- 重签名
codesign -f -s "iPhone Distribution: Zhejiang Cainiao Supply Chain Management Co., Ltd." --entitlements entitlements.plist Payload/YiMa.app
- 重新打包
zip -qr app-resigned.ipa Payload/
重签名过程中遇到的坑
- 在 iOS8之后,code sign 如果不添加
--entitlements entitlements.plist
参数的话,会导致重签名之后的 app 无法启动,跟踪堆栈会发现如下的 log 输出:
var/mobile/Media/PublicStaging/YiMa.app/ : Error Domain=LaunchServicesError Code=0 "The operation couldn’t be completed. (LaunchServicesError error 0.)" UserInfo=0x13f627620 {Error=ApplicationVerificationFailed, ErrorDescription=Application is missing the application-identifier entitlement.}
解决方法是创建一个 entitlements.plist 文件,参考:http://stackoverflow.com/questions/28195564/enterprise-app-deployment-doesnt-install-on-ios-8-1-3
- 重签名成功,但是通过 Xcode 无法安装,错误如下
这个问题困扰了了很久,原因是如果你的 APP 需要 APNs 推送,那么 在 developer.apple.com 中 创建的 App ID 必须勾选 Push Notifications 功能选项,你的 provisioning profile 文件中必须包含以下字段(可以通过 Sublime 等编辑器查看)
<key>aps-environment</key>
<string>production</string>