iOS 構(gòu)建時支持動態(tài)指定構(gòu)建模式和 bundleId

本篇主要作為前文的補充绝骚,介紹一些構(gòu)建上的調(diào)整

《Flutter 搭建 iOS 命令行服務(wù)打包發(fā)布全保姆式流程》 里介紹過如何通過自定義配置汤求,完成一套自己企業(yè)內(nèi)部的自定義構(gòu)建過程义郑,當(dāng)然也有一些建議如使用:fastlane到千、jenkinsappcenter 等等幅狮,事實上也嘗試過這些平臺睹欲,也在上面使用過一段時間,但是這里解釋為什么不用這些平臺:

  • 打包機器不登錄開發(fā)者賬號吼和,需要本地開發(fā)機器是 Automatic 涨薪,而打包機上使用 Manual;
  • 一個項目需要支持打包時指定 mobileprovisionbundleId炫乓,例如 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)替換 mobileprovisionbundleId拉盾。

通過對比之前的 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 化的貢獻吧~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市会喝,隨后出現(xiàn)的幾起案子陡叠,更是在濱河造成了極大的恐慌,老刑警劉巖肢执,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枉阵,死亡現(xiàn)場離奇詭異,居然都是意外死亡预茄,警方通過查閱死者的電腦和手機兴溜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耻陕,“玉大人拙徽,你說我怎么就攤上這事∈” “怎么了膘怕?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長召庞。 經(jīng)常有香客問我岛心,道長来破,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任忘古,我火速辦了婚禮徘禁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘髓堪。我一直安慰自己送朱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布干旁。 她就那樣靜靜地躺著骤菠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疤孕。 梳的紋絲不亂的頭發(fā)上商乎,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音祭阀,去河邊找鬼鹉戚。 笑死,一個胖子當(dāng)著我的面吹牛专控,可吹牛的內(nèi)容都是我干的抹凳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼伦腐,長吁一口氣:“原來是場噩夢啊……” “哼赢底!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柏蘑,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤幸冻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咳焚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洽损,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年革半,在試婚紗的時候發(fā)現(xiàn)自己被綠了碑定。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡又官,死狀恐怖延刘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情六敬,我是刑警寧澤碘赖,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響崖疤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜典勇,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一劫哼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧割笙,春花似錦权烧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乱顾,卻和暖如春板祝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背走净。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工券时, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伏伯。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓橘洞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親说搅。 傳聞我的和親對象是個殘疾皇子炸枣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容