provision profile文件過時與iOS App從新簽名

本文主要參考:iOS App從新簽名方法介紹 - Haven's Blogios

其實iPA文件就是zip文件,只是後綴不一樣而已。要重簽名,咱們須要準備證書與provision profile, 證書直接在Keychian裏管理,provision profile與證書是對應關係。 真機調試或提交過App到App Store的朋友都應不會陌生。
shell

下面直接說步驟:
a.解壓iPA文件
b.刪掉舊的簽名文件
c.拷貝新的provision profile替換舊的embedded.mobileprovision
d.用codesign命令重簽名
f.從新zip爲iPA文件
app

下面有一個腳本,它完成了上面5步驟:iphone

#!/bin/sh
if ! ([ -f "$1" ]); then
echo \"${1}\"文件不存在
exit
fi
ipaName=${1%.ipa}
if [ "$ipaName" = "$1" ]; then
echo \"${1}\"不是ipa文件
exit
fi
## step 1, unzip ipa file
unzip ${ipaName}.ipa
## step 2, remove old codesign
rm -rf Payload/*.app/_CodeSignature/
## step 3, copy new provision profile
cp 123.mobileprovision Payload/*.app/embedded.mobileprovision
## step 4, codesign with new certificate and provision
(/usr/bin/codesign -f -s "iPhone Developer: XXXXX (XXX)" --resource-rules Payload/*.app/ResourceRules.plist Payload/*.app/) || {
## if code sign error, will to here
echo failed
rm -rf Payload/
exit
}
## step 5, zip it
zip -r ${ipaName}abc.ipa Payload/
rm -rf Payload/

須要注意腳本中有兩處須要大家手動修改,第一處是123.mobileprovision,這個文件須要與腳本放同一目錄,第二處是XXXXX (XXX), 這兒XXX改成你keychian裏有的證書,只須要改XXX, 括號保留。ide

個人筆記:測試

上面的括號並非必定必要的,這要視你的keychian裏的證書而定。若是在keychian證書列表裏你須要的證書帶括號,那麼就帶括號,若是不帶,就不須要。this

另外,注意證書重名的問題,若是重名了,會出現下面的提示:google

iPhone Distribution: XXXXXX ambiguous (matches "iPhone Distribution: XXXXX" and "iPhone Distribution: XXX" in /Users/admin/Library/Keychains/login.keychain)spa

去掉重名的證書就能夠解決問題了
調試


延伸用途:用於判斷provision profile文件是否失效/過時

最近遇到一個問題,用企業證書發佈的app下載安裝失敗,主要表現是安裝進度條能看到是滿了,可是最後一步就是不行,猜想是驗證不成功。

首先就是猜想provision profile過時了,可是在developer中心查看對應bundle ID的provision profile,是沒有過時的,這自己就很奇怪,無論怎樣,先試一下吧。先在developer中內心把這個provision profile刪除掉,再從新生成一個並下載。而後使用上面的方法,試試從新簽名的ipa可否安裝。通過個人測試,從新簽名的ipa在個人iPhone上是能夠安裝的。


這個問題的另外一種分析方法

將iPhone連上Mac,打開Xcode,選擇菜單上的Window——Devices,找到本身的設備名,查看右下方的log,能夠看到下面的日誌:

Aug 19 14:54:30 iphone installd[5481] <Notice>: 0x100594000 -[MIInstaller performInstallationWithError:]: Installing <MIInstallableBundle ID=cn.app.test; Version=6_1434698124, ShortVersion=1.4>
Aug 19 14:54:30 iphone misagent[5495] <Error>: attempt to install invalid profile: 0xe8008011
Aug 19 14:54:30 iphone installd[5481] <Error>: 0x100594000 -[MIInstallableBundle _installEmbeddedProfileInBundle:]: Could not install embedded profile: 0xe8008011 (Expired)

根據這篇文章,0xE8008011表明The Provisioning Profile being loaded is expired,能夠確認就是Provisioning Profile過時了。

ipa安裝失敗時出現的各類錯誤碼的意義:

0xE8008003 - It was unable to get the Creation Date of the Provisioning Profile being loaded

0xE8008010 - Provisioning Profile Version is not equal to 1 (?)

0xE8008012 - The UUID of the device does not match any in the Provisioning Profile being loaded

0xE8008011 - The Provisioning Profile being loaded is expired

0xE8008003 - No UUID included in the Provisioning Profile that is being loaded

0xE8008015 - A valid provisioning profile for this executable was not found



0xe8008016 緣由可能之一是證書名正確,Profile裏的App ID不正確,可能緣由2是app id正確而證書名不正確


20160421更新:

遇到0xE8008015報錯問題的一種狀況:從開發者中心下載了發佈證書,沒在先在生成csr(certSigningRequest)文件的Mac上安裝,而是直接在另外一臺電腦上安裝的,致使安裝的證書沒有私鑰。對應的mobileprovision文件會提示valid signing identity not found,不知道爲啥能正常生成ipa文件。

解決方法是先在生成csr(certSigningRequest)文件的Mac上雙擊發布證書安裝,而後在keychain中導出證書,並設置密碼,把生成的p12證書導入另外一臺Mac雙擊安裝,輸入密碼,安裝成功後在keychain中應該就能看到私鑰的。這時候從新生成的ipa文件就能正常安裝了

相關文章
相關標籤/搜索