iOS自动化打包之重签名导出不同证书ipa探索
在完成基礎的自動包打包流程過后, 隨即也出現了日常中常見的問題, 比如我們每次需要打出不同網絡環境和不同證書的ipa, 由于開發者可以添加的設備只有100個, 而公司的幾個項目都是用的一個賬號, 各項目組都是獨立的, 再加上期間加入設備的員工的離職, 真正能參與測試的設備寥寥無幾。
所以我司一般測試都是使用企業證書, 這樣不同的項目都可以公用同一個證書, 不僅管理起來方面, 而且還擺脫了設備數量限制的煩惱, 但另一方面, 對于需要測試內購等功能的時候, 仍然需要使用adhoc證書的包來進行測試。
我們原先的打包策略是通過執行腳本時輸入的參數來打對應的包, 這樣對于不同測試并行測試, 一次就要打出好幾個, 以我司作為打包服務器 Mac Mini 來說, archive + export 一個包的時間約為20min, 對于不同證書不同環境的包隨機組合, 一次打出4個不同的包的時間就要花費約1h20min, 而且在打包的時候, 如果其他同事修改了新的bug, 也無法打包。
因此, 我們尋思能不能通過重簽名的方式, 只編譯一次, 對其重簽名, 打出不同的包。
本文主要介紹我在此過程中的一些探索, 旨在提高不同證書不同環境的打包效率。
對ipa進行重簽名
起初, 我在網上查閱了相關資料, 按照相關教程, 卻最終以失敗告終。 如果有同學直接對ipa進行重簽名成功的, 希望不吝賜教。
我估摸著是不是內部做了什么驗證, 導致對ipa重簽名無法成功。所以, 我想可不可以不到ipa這步, 更早地對其進行信息的修改以及重簽名, 權當一次嘗試, 即使失敗也能在探索中學到新知識。最終, 成功將原來打4個包需要1h20min的時間壓縮到30min不到。
不等導出ipa, 修改.xcarchive文件
.xcarchive文件是對項目進行手動archive, 或執行以下腳本:
xcodebuild archive -workspace ${work_space} -scheme ${scheme} -configuration ${configurationDistribution} -archivePath ${archivePath} 復制代碼如果對打包命令不是很了解的, 可以查看我的上一篇文章文章:關于iOS自動化打包的一些分享
首先, 我們進入到 .xcarchive 文件目錄, 發現里面一個 Info.plist 文件, 打開如下顯示:
我們可以看到里面有一些App必需的屬性。
1. 修改 .xcarchive 的 Info.plist
此處, 如果項目 Bundle Identifier 需要發生改變, 則修改 CFBundleIdentifier 對應的值, 并將 SigningIdentity 改成 Bundle Identifier 對應的證書, 關于此處SigningIdentity的值, 可在鑰匙串中找到對應的證書, 查看其信息, 即為下圖中(英文系統)的 Common Name 。
2. 修改 App Extension 相關信息
此步是對于項目 target 中如 notification extension 等從屬 target, 如果沒有 App Extension , 直接可以跳過此步, 查看下一步 修改主target相關信息 。
通過文件夾打開 YourAppName.xcarchive/Products/Applications/YourAppName.app/PlugIns/YourAppNameNotificationServiceExtension.appex , 這里不是標準文件夾, open 命令似乎不起作用, 觀察其目錄結構:
2.1 修改 Info.plist 相關信息
App Extension 的 Bundle Identifier 是 App 的 Bundle Identifier 加上其對應后綴, 如 notificationserviceextension 。
修改 Bundle Identifier 為對應的值, 這里對應的值是指之前修改 .xcarchive 目錄中 Info.plist 的 Bundle Identifier 對應, 如 com.test.www , 這里便是 com.test.www.notificationserviceextension。
2.2 替換 Provisioning Profile
將對應的 Provisioning Profile 拷貝到該目錄下替換原來的 Provisioning Profile , 改成相同的文件名 embedded.mobileprovision 。
2.3 修改 archived-expanded-entitlements.xcent
我們通過xcode打開archived-expanded-entitlements.xcent, 其本質就是plist文件, 格式是 teamId.bundle identifier 。
修改圖中遮蓋的兩項值, 依舊是要和.xcarchive的Info.plist值對應。
2.4 重簽名
用對應的證書對 App Extension 重新簽名, 這里的 YourCetificateName 依舊是修改 .xcarchive的Info.plist 里的證書名。
codesign -f -s "YourCetificateName" YourAppNameNotificationServiceExtension.appex 復制代碼3. 修改主target相關信息
與上一步修改 App Extension 步驟基本相同, 只是少一步, 不用修改 archived-expanded-entitlements.xcent 。
3.1 修改Info.plist的相關信息
進入.app目錄, 修改Info.plist的Bundle Identifier, 使其與.xcarchive文件對應。
你也可以修改其他一些值, 如網絡環境, 是測試環境, 還是生產環境, 這里只是拋磚引玉。事實上, 修改網絡環境有方便的方法, 如通過讀取粘貼板的文本來切換, 或者寫一個輔助程序來打開我們的App, 從而通知切換環境。
3.2 替換Provisioning Profile
將對應的 Provisioning Profile 拷貝到該目錄下替換原來的 Provisioning Profile , 改成相同的文件名 embedded.mobileprovision 。
3.3 重簽名
用對應的證書對 .app文件 重新簽名, 這里的 YourCetificateName 依舊是修改 .xcarchive的Info.plist 里的證書名。
codesign -f -s "YourCetificateName" YourAppName.app 復制代碼4. 導出包
xcodebuild -exportArchive -archivePath YourAppName.xcarchive -exportPath $(pwd) -exportOptionsPlist YourExportOptionsPlistPath 復制代碼成功后, 命令臺輸出:
如果對于 exportOptionsPlist 不了解的, 也可以看我的上篇文章:關于iOS自動化打包的一些分享 。
注意點
上述修改的每一步, 無論是Bundler Identifer, 還是Provisioning Profile, 還是重簽名用的證書, 都是需要相對應的, 如果有一步錯了, ipa包是導不出來的。
我的表述可能不是那么清楚, 相信大家操作一次, 一步一步來, 修改需要修改的值, 其實基本是一目了然的。 大家如果有類似需求, 建議先操作一次, 成功后再寫腳本實現自動化。
總結
經過上述操作, 實質上只進行了一次編譯, 然后修改相關信息, 導出對應不同的證書的包, 只是多做了幾次導出操作, 大大地節省了打包時間。大家如果有什么想法或更好的辦法, 歡迎一起討論討論。
轉載于:https://juejin.im/post/5aa156b1f265da23866f7931
總結
以上是生活随笔為你收集整理的iOS自动化打包之重签名导出不同证书ipa探索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 被乔布斯遗忘的VR:纽约大学教授解密苹果
- 下一篇: [OS][FS]查看ext3文件系统分区