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