2018年7月19日 星期四

iOS IPA包重簽 App內含Extension (Resign the .ipa with extension)


此內容為App含有Extension(例如 Share Extension、Today Extension、Intents Extension等)的ipa檔重包步驟,如果是未含Extension,可參考iOS IPA包重簽 (Resign the .ipa)

--

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

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

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

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

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

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

PluginProfile.mobileprovision請輸入Extension描述檔檔名:
$ security cms -D -i PluginProfile.mobileprovision > pluginProvision.plist

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' pluginProvision.plist > pluginEntitlements.plist

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

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

Extension.appex請根據PlugIns資料夾下的.appex檔名:
$ rm -rf Payload/MyApp.app/PlugIns/Extension.appex/_CodeSignature

E.       根據描述檔內容,AppBundleID請輸入與描述檔內的App ID相同,MyAppGroupID請輸入所設定之App Group
$ /usr/libexec/PlistBuddy Payload/MyApp.app/Info.plist

Set :CFBundleIdentifier AppBundleID
Set :AppGroupID MyAppGroupID
save
quit

F.      根據Extension描述檔內容,ExtensionAppBundleID請輸入與Extension描述檔內的App ID相同,MyAppGroupID請輸入所設定之App Group
$ /usr/libexec/PlistBuddy Payload/MyApp.app/PlugIns/Extension.appex/Info.plist

Set :CFBundleIdentifier ExtensionAppBundleID
Set :AppGroupID MyAppGroupID
save
quit

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

$ cp PluginProfile.mobileprovision Payload/MyApp.app/PlugIns/Extension.appex/embedded.mobileprovision

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

$ /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/*

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

之後直接使用新產生的ipa檔即可,而原先的ipa檔以及在重簽過程中所產生的檔案皆不會再使用,建議可將檔案刪除。