在工作中分發內測應用是經常遇見的,常見的方式有:TestFlight,用企業級開發者賬號,搜集UDID打包等方式,每種方式都各有利弊。
由于公司有企業級開發者賬號,所以平常應用內測比較簡單:直接拿企業級賬號打包.ipa,將.ipa發布到內測平臺(比如蒲公英,fir.im),測試人員直接下載安裝就可,只是第一次需要信任一下企業級證書。
在工作中,有時候我們需要分發某個app的.ipa包,并沒有改app的源碼,無法用自己的賬號打包。這時就用到了重簽名。
其實ipa重簽名的應用場景很多,比如App Store上的付費應用,可以使用自己的開發者賬號,其.ipa包重新簽名,就可以安裝了。各大app助手平臺就是這么做的。注意直接從App Store下載的應用是加殼的,無法直接重新簽名,必須砸殼。iOSRE逆向
iReSign
iReSign是一個重簽名工具
操作步驟:
- 選擇.ipa包的路徑
- 選擇
embedded.mobileprovision
文件路徑。embedded.mobileprovision
是用于打包的配置文件Provisioning Profiles
。可以直接在Certificates, Identifiers & Profiles
中下載,注意下載之后需要將名字設置為embedded.mobileprovision
。也可以在之前用該文件打包過的.ipa中找:解壓.ipa -> Payload -> xx.app顯示包內容 ->embedded.mobileprovision
- 網上有資料說entitlements.plist不需要填寫。我試過不填寫或填寫,我按照本文iOS證書及ipa包重簽名探究的方式寫的.plist文件。
- 選中修改ID,填寫修改的appid
- 選擇證書,下拉列表會顯示mac上有的證書。
- 點擊重新簽名!
結果是失敗了。
錯誤信息如下,可以查看該錯誤的IResign上的issues
[General] Error Domain=NSCocoaErrorDomain Code=3840 "Unexpected character s at line 1" UserInfo={NSDebugDescription=Unexpected character s at line 1, kCFPropertyListOldStyleParsingError=Error Domain=NSCocoaErrorDomain Code=3840 "Unexpected ';' or '=' after key at line 1" UserInfo={NSDebugDescription=Unexpected ';' or '=' after key at line 1}}
另外還有一個重簽名工具:ios-app-signer
實踐篇:iOS 應用重簽名(上)這篇文章介紹了entitlement文件如何寫,ios-app-signer的使用。我沒有測試該方法是否可行。
使用sigh腳本
在iReSign失敗后,我在網上找到使用sigh腳本的方式來重簽名。
- 安裝神器brew,沒有安裝的看這里:Homebrew
- 安裝ruby,命令:
brew install ruby
- 安裝sigh,命令:
sudo gem install sigh
,過程比較漫長。
安裝sigh腳本后,開始進行重簽名,步驟如下
- 在終端輸入
sigh resign
,回車 - 把要簽名的ipa文件拖到窗口上,回車
- 填寫用來簽名的證書名,回車
- 把項目的配置文件embedded.mobileprovision文件拖到窗口上,回車
- 好了,resign腳本會自動更改bundel id,簽名并重新打包。
注意ipa包名不要有中文。如果應用有多個targetes無法用上述方式重簽名。參考文章:iOS的ipa重簽名
我按照如上步驟操作,成功使用企業級證書打包,上傳到蒲公英內測平臺上,也顯示的是企業級應用,但是無法安裝,提醒無法下載app,我手機上沒有從App Store上下載安裝該應用,排除了無法覆蓋問題。
iOS9以后,企業級應用不會出現信任按鈕,如果ipa包和網頁的bundle ID
不匹配,就無法安裝。在iOS9之前是沒有檢測的。詳情見大神iOS程序犭袁的文章ios9適配系列教程
我操作成功的辦法
經過了無數次測試sigh腳本簽名方式,最后即將放棄的時刻成功了。
- 將需要重簽的.ipa文件和
embedded.mobileprovision
配置文件放到同一個文件夾下。注意路徑和文件名中不要出現中文,配置文件名一定要是embedded
。 - 在終端中cd到該路徑下
- 使用sigh腳本:
sigh resign
回車,運行結果跟上面是不一樣的,會直接出現Signing Identity:
讓我填證書名。上述方式應該是第二步拖ipa文件到窗口,Path to ipa file:
- 在
Signing Identity:
上面會出現一串可用的identity
,這里要輸入這些identity
的十六進制串。回車 - 成功了:
Successfully signed 路徑/xxx.ipa!
原來文件夾中的.ipa已經被重簽名了。上傳到蒲公英內測平臺,完全可以下載使用。
本文涉及到的知識點都是從網上Google的,感謝網友們分享的資料,還涉及的一些參考資料: