重新簽名顧名思義:將原來的ipa包,使用新的證書重新簽名,然后可以在指定的設(shè)備上安裝,比如:我們需要將一個別人的ipa包(限制安裝),使用企業(yè)證書重簽之后可以在任何的手機上安裝。
參考鏈接:
需要準備的文件:
appName.ipa: 要重簽名的ipa
embedded.mobileprovision: 用來簽名的provision文件
entitlements.plist: 授權(quán)機制
distributionName: 指該簽名對應的證書的名字,在keychain中可以找到對應證書的名稱
下面是具體的步驟:
- 1.下載iReSign,然后運行Demo,運行起來見下圖:

2.第一行:引入需要重簽的ipa包(這里我的測試的包是Release.ipa)
3.第二行:引入mobileprovision文件(我這里使用的是企業(yè)證書的provision文件)

- 4.第三行:引入entitlements.plist文件【這個也可以不選喲,iResign會自動生成的--最好使用自動生成的】
授權(quán)機制entitlements.plist
授權(quán)機制決定了哪些系統(tǒ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>DH8YJ3MU52.com.q001.niuniu1</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>DH8YJ3MU52</string>
<key>get-task-allow</key>
<false/>
<key>keychain-access-groups</key>
<array>
<string>DH8YJ3MU52.*</string>
</array>
</dict>
</plist>
注意:application-identifier中的AppID必須是用來重簽名證書上的AppID,不然重簽名出來的ipa包安裝會出錯
我們需要修改的字段的值:
application-identifier、com.apple.developer.team-identifier、keychain-access-groups
這些參數(shù)怎么來?參考:mac下查看.mobileprovision文件及鑰匙串中證書.cer文件
打開終端:輸入security cms -D -i mobileprovision文件的路徑
回車:我們可以看到mobileprovision文件里內(nèi)容(這樣可以復制了)
【或者自己手動輸入也可以的,使用空格鍵查看mobileprovision文件,找到相應的信息即可】
自己創(chuàng)建entitlements.plist文件,然后復制上面的,修改字段的值即可
- 5.第四行:輸入App ID (application-identifier字段的值:我這里是DH8YJ3MU52.com.q001.niuniu1)
【注意】這里也可以不寫喲,這樣還是保持原來的bundleid,推送還是照樣走原來的 - 6.點擊p12 文件,然后選擇我們所導入 的p12文件
- 7.點擊重新簽名即可
- 8.生成重新簽名的ipa為:Release-resigned.ipa
- 9.接下來我們看看如何測試ipa是否簽名成功了
參考:Xcode直接安裝ipa
注意點:
1.mobileprovision文件名字可以隨便取,iReSign程序在將mobileprovision文件拷貝到app中時會重命名為embedded.mobileprovision。
2.第三行entitlement.plist必須填寫,不然會一直卡在Entitlements generated。
3.不需要修改BundleID時,修改ID前面的CheckBox不要勾選
可能遇到的問題:
問題一:Error:Product identifiers don't match
解決方法:
可以將源碼中的這個判斷去掉。
NSDictionary *infoplist = [NSDictionary dictionaryWithContentsOfFile:[appPath stringByAppendingPathComponent:@"Info.plist"]];
// if ([identifierInProvisioning isEqualTo:[infoplist objectForKey:kKeyBundleIDPlistApp]]) {
NSLog(@"Identifiers match");
identifierOK = TRUE;
// }
【iReSignAppDelegate.m文件里面】
問題二:App installation failed
解決方法:
查看entitlements.plist文件中的application-identifier的Ap pID是不是用來重簽名證書上的AppID