參數(shù)說明
appName.ipa: 要重簽名的ipa
embedded.mobileprovision: 用來簽名的provision文件
entitlements.plist: 授權(quán)機制
distributionName: 指該簽名對應(yīng)的證書的名字,在keychain中可以找到對應(yīng)證書的名稱
第一步:解壓IPA
unzip appName.ipa
第二步:修改BundleID(應(yīng)用顯示名字也可以修改,不需要修改則跳過)
修改路徑 Payload/appName.app/Info.plist 中 Bundle identifier 的值,改成你希望的bundleID。
第三步:更換證書
cp embedded.mobileprovision Payload/appName.app
provision文件名字一定要改成embedded,因為Payload/appName.app中的證書名字就是embedded。
第四步:對framework中的動態(tài)庫重簽名
必須對Payload/appName.app/framework中的動態(tài)庫進(jìn)行重簽名,不然應(yīng)用安裝成功后,會閃退。
codesign -fs "iPhone Distribution: TuTu Da (CDJ7TE32UE)" --no-strict --entitlements entitlements.plist Payload/appName.app/Frameworks/ZegoAVKit2.framework
我的項目Payload/appName.app/framework中只有ZegoAVKit2.framework,所以只對ZegoAVKit2.framework進(jìn)行重簽名。
第五步:對Payload/appName.app重簽名
codesign -fs "iPhone Distribution: TuTu Da (CDJ7TE32UE)" --no-strict --entitlements entitlements.plist Payload/appName.app
第六步:打包
zip -r newName.ipa Payload
可能遇到的問題:
問題一:安裝重簽名的ipa包后,打開應(yīng)用閃退
解決方法:
對app包重簽名前必須先對framework中的動態(tài)庫進(jìn)行重簽名。
問題二:App installation failed

解決方法:
查看entitlements.plist文件中的application-identifier的BundleID是不是用來重簽名證書上的BundleID。
授權(quán)機制entitlements.plist
授權(quán)機制決定了哪些系統(tǒng)資源在什么情況下允許被一個應(yīng)用使用。簡單的說它就是一個沙盒的配置列表。Xcode會將這個文件作為 --entitlements參數(shù)的內(nèi)容傳給codesign。
這個文件內(nèi)部格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>CDJ7TE32UE.com.test.test</string>
<key>aps-environment</key>
<string>production</string>
<key>com.apple.developer.associated-domains</key>
<string>*</string>
<key>com.apple.developer.team-identifier</key>
<string>CDJ7TE32UE</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>CDJ7TE32UE.*</string>
</array>
</dict>
</plist>
注意:application-identifier中的BundleID必須是用來重簽名證書上的BundleID,不然重簽名出來的ipa包安裝會出錯。
實用命令
利用security命令查看系統(tǒng)中所有可以用來對代碼進(jìn)行簽名的私鑰:
security find-identity -v -p codesigning
利用security命令查看. mobileprovision文件內(nèi)容:
security cms -D -i example.mobileprovision
利用codesign命令查看appName.app的簽名信息:
codesign -vv -d Payload/appName.app
利用codesign檢查二進(jìn)制文件是否已經(jīng)設(shè)置好簽名:
codesign --verify Payload/appName.app
如果簽名完好則沒有任何輸出。
利用codesign查看簽名信息中包含哪些授權(quán)信息:
codesign -d --entitlements - Payload/appName.app
對ipa重簽名的其他方式
方式一:用iReSign工具進(jìn)行ipa重簽名
方法二:ipa重簽名-ruby實現(xiàn)
參考文章
代碼簽名探析
iOS證書及ipa包重簽名探究
sign重簽名的App部分手機不能安裝
Entitlements.plist not created properly