將一個ipa文件解壓後,顯示包內容,能夠看到app文件目錄下包含了這2個文件:_CodeSignature(ipa的簽署文件)和embedded.mobileprovision(證書配置文件),另外還有一個本身配置的entitlements.plist受權文件,它們就是重簽名的關鍵。bash
爲了方便描述,先定義一些文件名(請根據本身的狀況修改):app
假設你的證書名爲 myInhouse. mobileprovisionide
假設你的inhouse簽署名爲 iPhone Distribution: ABCD technology co., LTD.spa
假設你的ipa包名爲 efg.ipacode
首先,查看myInhouse. mobileprovision的信息,在終端輸入命令:ip
security cms -D -i myInhouse.mobileprovision
執行後輸出信息中的內容,獲得一個 XML 格式信息,找到Entitlements字段;it
而後,建立一個 entitlements.plist 文件,按照上圖中Entitlements的信息配置,以下圖:io
編寫腳本,命名爲 resign.shclass
#!/bin/sh if ! ([ -f "$1" ]); then echo ----- \"${1}\"文件不存在 exit fi ipaName=${1%.ipa} if [ "$ipaName" = "$1" ]; then echo ----- \"${1}\"error 不是ipa文件 exit fi ## step 1 解壓ipa unzip ${ipaName}.ipa ## step 2 刪除舊簽名文件 rm -rf Payload/*.app/_CodeSignature/ ## step 3 拷貝證書配置和權限文件 cp myInhouse.mobileprovision Payload/*.app/embedded.mobileprovision cp entitlements.plist Payload/*.app/ ## step 4 重簽名 ( /usr/bin/codesign -f -s "iPhone Distribution: ABCD technology co., LTD." --entitlements Payload/*.app/entitlements.plist Payload/*.app/ ) || { rm -rf Payload/ rm -rf __MACOSX/ exit } ## step 5 打包 zip -r ${ipaName}_resign.ipa Payload/ rm -rf Payload/ rm -rf __MACOSX/
腳本寫完後,將 entitlements.plist 、myInhouse.mobileprovision 、resign.sh 、efg.ipa 放到同一目錄ipaResign下,mobile
而後打開終端,cd至ipaResig目錄,再執行以下命令運行腳本:
sh resign.sh efg.ipa
稍稍等候,efg_resign.ipa 就OK啦。
安裝完efg_resign.ipa不要忘記信任企業證書,否則進不了應用。
上述工做完成後,若是之後還有須要用同一個證書重簽名的,直接將ipa丟到ipaResign,運行腳本就能夠了,是否是很方便 😊。
--2016-8-10--補-充--------------我---是---分---割---線----------------
補充一下簽名成development和distribution的不一樣之處。
雖然不多有需求要這麼作,可是最近碰到一個朋友就遇到了。(我能說什麼呢..... -.-!)
首先,須要知道應用的惟一標識(application-identifier)是:證書ID+Bundle Identifier;
證書ID能夠在鑰匙串中看到,如圖,圖裏括號中的7N2275G95N就是證書ID。
籤成development的時候,上面腳本中 step 4 的簽署名要與鑰匙串中的對應,包括括號和證書ID,因此腳本中第4步應該改爲:
## step 4 ( /usr/bin/codesign -f -s "iPhone Developer: developerName (7N2275G95N)" --entitlements Payload/*.app/entitlements.plist Payload/*.app/ ) || { rm -rf Payload/ rm -rf __MACOSX/ exit }
這裏要特別注意:第4步寫developer的證書ID,可是在受權文件 entitlements.plist 中,前綴不能是developer的,而應該與mobileprovision文件中的證書ID一致(查看mobileprovision文件信息參考第一步)。
其他參考第二步。
參考第四步,惟一的不一樣是腳本 step 4 中的簽署名要改爲發佈的簽署,證書ID也須要對應。