本篇主要作為前文的補充绝骚,介紹一些構(gòu)建上的調(diào)整
在 《Flutter 搭建 iOS 命令行服務(wù)打包發(fā)布全保姆式流程》 里介紹過如何通過自定義配置汤求,完成一套自己企業(yè)內(nèi)部的自定義構(gòu)建過程义郑,當(dāng)然也有一些建議如使用:fastlane
到千、jenkins
、appcenter
等等幅狮,事實上也嘗試過這些平臺睹欲,也在上面使用過一段時間,但是這里解釋為什么不用這些平臺:
- 打包機器不登錄開發(fā)者賬號吼和,需要本地開發(fā)機器是 Automatic 涨薪,而打包機上使用 Manual;
- 一個項目需要支持打包時指定
mobileprovision
和bundleId
炫乓,例如 QA 和 Prod 打包后是兩個不同的bundleId
刚夺,兩個 ipa 可以同時存在手機上献丑; - 自定義構(gòu)建時修改某些信息;
所以基于這些光督,最終決定了自己構(gòu)建一套 命令行的打包模式 阳距,大概總結(jié)是:
- 通過 PlistBuddy 在編譯時修改 plist 信息;
- 生產(chǎn)不同的
mobileprovision
文件结借; - 在 Xcode 取消 automatically manage signing筐摘,選擇導(dǎo)入 Profile 文件,然后通過 git 生成 .patch 船老,在打包機器上執(zhí)行 git apply 咖熟;
- 通過 xcodebuild 打包構(gòu)建;
- 通過 ExportOptions.plist 模版進行 xcodebuild -exportArchive 得到 ipa 柳畔;
詳細流程可以看上面原文馍管,但是這個流程其實一直有一個問題,那就是通過 git 生成 .patch 文件薪韩,每次一旦 project.pbxproj
出現(xiàn)變化确沸, 就可能會導(dǎo)致 git apply 失敗。
Xcode 作為高度 UI 化的開發(fā)工具俘陷,經(jīng)常出現(xiàn)調(diào)整一個配置就會導(dǎo)致 project.pbxproj
出現(xiàn)大量更改的情況罗捎,所以后面開始尋找一種更為官方的方式,來實現(xiàn)打包時動態(tài)替換 mobileprovision
和 bundleId
拉盾。
通過對比之前的 git diff 文件桨菜,可以看到改變還是有規(guī)律的,從 Automatic 到 Manual 指定 mobile provision 文件捉偏,主要變化的部分有:
- 新增的 ProvisioningStyle 倒得、 CODE_SIGN_IDENTITY、CODE_SIGN_STYLE 和 PROVISIONING_PROFILE_SPECIFIER 這幾個更改夭禽;
- 除了 ProvisioningStyle 之外霞掺,其他更改在 debug、profile讹躯、release 配置下都規(guī)律性出現(xiàn)變化菩彬;
首先解釋下這幾個配置:
- ProvisioningStyle = Manual 表示了打包時采用手動簽名的模式;
- CODE_SIGN_IDENTITY 表示打包模式的 Inentity蜀撑;
- CODE_SIGN_STYLE 表示對應(yīng)打包模式下的簽名模式挤巡;
- PROVISIONING_PROFILE_SPECIFIER 表示指定的 mobileprovision 的 name剩彬;
- DEVELOPEMNT_TEAM 就是你開發(fā)者賬號所在的 team Id酷麦;
所以到這里,可以考慮在打包時通過直接通過系統(tǒng) sed
命令來實現(xiàn)動態(tài)調(diào)整喉恋,事實上 網(wǎng)上 還真有類似的建議沃饶,比如:
sed -i ‘’ ‘s/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/’ MyProj.xcodeproj/project.pbxproj
sed -i ‘’ “s/DevelopmentTeam = ${DevelopmentTeamID};/DevelopmentTeam = \”\”;/” MyProj.xcodeproj/project.pbxproj
sed -i ‘’ “s/DEVELOPMENT_TEAM = ${DevelopmentTeamID};/DEVELOPMENT_TEAM = \”${TEAM_ID}\”;/” MyProj.xcodeproj/project.pbxproj
從這段腳本可以看到母廷,就是通過 sed
去調(diào)整 ProvisioningStyle 和 DevelopmentTeam 等,但是這里有個問題糊肤,就是你的 project.pbxproj
不一定有 ProvisioningStyle 配置琴昆,因為如果是默認 automatically manage signing ,可能 project.pbxproj
文件下是沒有這個參數(shù)馆揉。
但是 DevelopmentTeam 和 DEVELOPMENT_TEAM 一定是有业舍,所以可以靈活變通一下,將命令改為
///改為 Manual
sed -i '' 's/DevelopmentTeam = 你的teamId;/DevelopmentTeam = 你的teamId;\nProvisioningStyle = Manual;/' ios/Runner.xcodeproj/project.pbxproj
/// option 1升酣、改為 Manual 和指定 provision
sed -i '' 's/PRODUCT_BUNDLE_IDENTIFIER = 原來的bundleID;/PRODUCT_BUNDLE_IDENTIFIER = 需要替換的bundleId;\nCODE_SIGN_IDENTITY = "iPhone Distribution";\nCODE_SIGN_STYLE = Manual;\nPROVISIONING_PROFILE_SPECIFIER = "描述文件的name";/' ios/Runner.xcodeproj/project.pbxproj
///option 2舷暮、改為 Manual 和指定 provision,但是不需要修改 bundleId 的
sed -i '' 's/DEVELOPMENT_TEAM = 你的teamId;/DEVELOPMENT_TEAM = 你的teamId;\nCODE_SIGN_IDENTITY = "iPhone Distribution";\nCODE_SIGN_STYLE = Manual;\nPROVISIONING_PROFILE_SPECIFIER = "描述文件名字";/' ios/Runner.xcodeproj/project.pbxproj
運行后的結(jié)果就是在 DevelopmentTeam 和 DEVELOPMENT_TEAM 下添加對應(yīng)所需的信息噩茄,從而達到指定 mobileprovision 和 Manual 簽名的目的:
- 需要替換 bundleId 的可以使用 PRODUCT_BUNDLE_IDENTIFIER 作為替換入口下面;
- 不需要替換 bundleId 的可以使用 DEVELOPMENT_TEAM 作為替換入口;
最后提一句绩聘,這里構(gòu)建的前提是沥割,每次打包時 clone 一個全新的目錄,構(gòu)建成功后刪除目錄的過程凿菩,所以整個構(gòu)建每次都是全新的机杜,如果對于這部分內(nèi)容感興趣的,還可以詳細參考以下資料:
《Flutter 搭建 iOS 命令行服務(wù)打包發(fā)布全保姆式流程》
《混編 Swift 遭遇動態(tài)庫和靜態(tài)庫問題填坑》
最后不得不吐槽一句蓄髓, Xcode 和 iOS 的在構(gòu)建打包部分的資料真的少叉庐,這大概也是因為 Xcode 的高度 UI 化的貢獻吧~