iOS 構建時支持動態指定構建模式和 bundleId

本篇主要作為前文的補充,介紹一些構建上的調整

《Flutter 搭建 iOS 命令行服務打包發布全保姆式流程》 里介紹過如何通過自定義配置,完成一套自己企業內部的自定義構建過程,當然也有一些建議如使用:fastlanejenkinsappcenter 等等,事實上也嘗試過這些平臺,也在上面使用過一段時間,但是這里解釋為什么不用這些平臺:

  • 打包機器不登錄開發者賬號,需要本地開發機器是 Automatic ,而打包機上使用 Manual;
  • 一個項目需要支持打包時指定 mobileprovisionbundleId,例如 QA 和 Prod 打包后是兩個不同的 bundleId,兩個 ipa 可以同時存在手機上;
  • 自定義構建時修改某些信息;

所以基于這些,最終決定了自己構建一套 命令行的打包模式 ,大概總結是:

  • 通過 PlistBuddy 在編譯時修改 plist 信息;
  • 生產不同的 mobileprovision 文件;
  • 在 Xcode 取消 automatically manage signing,選擇導入 Profile 文件,然后通過 git 生成 .patch ,在打包機器上執行 git apply ;
  • 通過 xcodebuild 打包構建;
  • 通過 ExportOptions.plist 模版進行 xcodebuild -exportArchive 得到 ipa ;

詳細流程可以看上面原文,但是這個流程其實一直有一個問題,那就是通過 git 生成 .patch 文件,每次一旦 project.pbxproj 出現變化, 就可能會導致 git apply 失敗。

Xcode 作為高度 UI 化的開發工具,經常出現調整一個配置就會導致 project.pbxproj 出現大量更改的情況,所以后面開始尋找一種更為官方的方式,來實現打包時動態替換 mobileprovisionbundleId

通過對比之前的 git diff 文件,可以看到改變還是有規律的,從 Automatic 到 Manual 指定 mobile provision 文件,主要變化的部分有:

  • 新增的 ProvisioningStyle 、 CODE_SIGN_IDENTITY、CODE_SIGN_STYLE 和 PROVISIONING_PROFILE_SPECIFIER 這幾個更改;
  • 除了 ProvisioningStyle 之外,其他更改在 debug、profile、release 配置下都規律性出現變化;

首先解釋下這幾個配置:

  • ProvisioningStyle = Manual 表示了打包時采用手動簽名的模式;
  • CODE_SIGN_IDENTITY 表示打包模式的 Inentity;
  • CODE_SIGN_STYLE 表示對應打包模式下的簽名模式;
  • PROVISIONING_PROFILE_SPECIFIER 表示指定的 mobileprovision 的 name;
  • DEVELOPEMNT_TEAM 就是你開發者賬號所在的 team Id;

所以到這里,可以考慮在打包時通過直接通過系統 sed 命令來實現動態調整,事實上 網上 還真有類似的建議,比如:

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 去調整 ProvisioningStyle 和 DevelopmentTeam 等,但是這里有個問題,就是你的 project.pbxproj 不一定有 ProvisioningStyle 配置,因為如果是默認 automatically manage signing ,可能 project.pbxproj 文件下是沒有這個參數。

但是 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


運行后的結果就是在 DevelopmentTeam 和 DEVELOPMENT_TEAM 下添加對應所需的信息,從而達到指定 mobileprovision 和 Manual 簽名的目的:

  • 需要替換 bundleId 的可以使用 PRODUCT_BUNDLE_IDENTIFIER 作為替換入口;
  • 不需要替換 bundleId 的可以使用 DEVELOPMENT_TEAM 作為替換入口;

最后提一句,這里構建的前提是,每次打包時 clone 一個全新的目錄,構建成功后刪除目錄的過程,所以整個構建每次都是全新的,如果對于這部分內容感興趣的,還可以詳細參考以下資料:

《Flutter 搭建 iOS 命令行服務打包發布全保姆式流程》

《混編 Swift 遭遇動態庫和靜態庫問題填坑》

最后不得不吐槽一句, Xcode 和 iOS 的在構建打包部分的資料真的少,這大概也是因為 Xcode 的高度 UI 化的貢獻吧~

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容