2018年6月21日 星期四

iOS IPA包重簽 (Resign the .ipa)


如果App含有Extension(例如 Share Extension、Today Extension、Intents Extension等),可參考iOS IPA包重簽 App內含Extension (Resign the .ipa with extension)

--

首先須先準備好ipa檔、憑證Certification(p12)和描述檔Provisioning Profile(.mobileprovision)

憑證與描述檔需匯入至電腦(檔案點擊兩下即完成匯入),另外在將ipa檔與描述檔先暫放至同一資料夾。接下來開啟Termainl.app(終端機)依照以下步驟輸入代碼,完成重簽並重新產生ipa檔:

(標示紅字代表為使用者自行輸入內容)

1.        切換至指定位置,Path請輸入ipa檔與描述檔所在的資料夾位置。
$ cd path

2.        根據描述檔內容產生entitlements.plistMyProfile.mobileprovision請輸入描述檔檔名。
$ security cms -D -i MyProfile.mobileprovision > provision.plist

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

3.        解壓ipa檔,MyApp.ipa請輸入ipa檔檔名
$ unzip MyApp.ipa

4.        刪除CodeSignature資料夾,MyApp.app檔名請根據解壓後Payload資料夾下的.app檔名
$ rm -rf Payload/MyApp.app/_CodeSignature

5.        根據描述檔內容,AppBundleID請輸入與描述檔內的App ID相同
$ /usr/libexec/PlistBuddy Payload/MyApp.app/Info.plist

Set :CFBundleIdentifier AppBundleID
save
quit

6.        覆蓋ipa檔的描述檔
$ cp MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

7.        重新簽名,iPhone Distribution請輸入企業憑證完整名稱,名稱可至「鑰匙圈存取(Keychain).app」取得,並請確認憑證之專用密鑰的取用權限控制是否允許所有應用程式存取。
$ /usr/bin/codesign -f -s "iPhone Distribution: Company Name (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

$ /usr/bin/codesign -f -s "iPhone Distribution: Company Name (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*


8.        打包,可自行重新命名新的ipa
$ zip -qr MyApp-resigned.ipa Payload