想象一個場景弃甥,我們正在開發(fā)一款支付系統(tǒng),這個支付系統(tǒng)同時支持有Web版和原生的iOS APP版本汁讼。
這個支付系統(tǒng)有三個環(huán)境:
- dev: 調(diào)用支付的開發(fā)環(huán)境接口淆攻,并不會真的扣錢。
- qa: 調(diào)用支付的測試環(huán)境接口嘿架,假的測試賬戶中的余額會發(fā)生變化瓶珊。
- production: 調(diào)用產(chǎn)品環(huán)境中的支付接口,賬戶余額和錢會真實(shí)發(fā)生變化耸彪。
對于 Web 版的系統(tǒng)伞芹,我可以在瀏覽器中打開三個窗口,然后依次輸入不同環(huán)境下的域名: www.dev.pay-example.com
搜囱,www.qa.pay-example.com
丑瞧,www.prod.pay-example.com
來分別進(jìn)行測試。
對于 iOS APP 呢蜀肘?我們想要的其實(shí)是類似的绊汹,打開一臺手機(jī),我們可以同時安裝三個APP:PayExampleDev
扮宠,PayExampleQA
西乖,PayExample
然后可以切換APP來使用它們狐榔。
那么怎樣通過一個 iOS 工程打包出三個不同的 APP 呢?方法很多获雕,本文我們就來介紹通過 Xcode Configuration
和 Scheme
的配置方式來實(shí)現(xiàn)薄腻。
添加 Xcode Configuration
- 新建 Group,命名為:Configuration
- 在 Configuration 中新建不同環(huán)境下的 Configuration Settings file
具體步驟如下圖:
配置項(xiàng)目的 Configuration
- 在不同的 Configuration file 中届案,配置需要的鍵值對庵楷,用于在項(xiàng)目中引用,具體配置楣颠,請參考 Demo源碼
- Project -> Info -> Configurations
- 將 Configurations 配置為 Dev尽纽、QA、Prod童漩,并配置對應(yīng)的 Configuration File
具體步驟如下圖:
創(chuàng)建 scheme
- 創(chuàng)建 scheme (PayExampleDev弄贿、PayExampleQA、PayExampleProd)矫膨,供不同環(huán)境使用
-
Edit Scheme -> Step -> Info -> Build Configuration
,配置對應(yīng)的 Build Configuration 為Dev侧馅、QA危尿、Prod
在項(xiàng)目配置中引用 xcconfig 中定義的變量
PayExample target -> General -> Display Name
- 配置 Display Name 為
$(PE_BUNDLE_NAME)
具體步驟如下圖:
在某一個 Scheme 上執(zhí)行某操作時,在此 Scheme 的此步驟上定義的 BuildConfig 就會生效施禾。
比如:
用于打包 QA 環(huán)境的scheme PayExampleQA
脚线,其 Build 配置的 Build Configuration
為 QA
QA
在 Configuration
中配置的 config
文件為:qa.xcconfig
項(xiàng)目中,APP 的 Display Name 的值為:$(PE_BUNDLE_NAME)
qa.xcconfig
中 PE_BUNDLE_NAME
的值為 PayExampleQA
如此 PayExampleQA scheme 在打包后弥搞,顯示的APP名稱為 PayExampleQA
Setup bundle identifier
iOS 中是通過 bundle identifier
來標(biāo)識不同的應(yīng)用的邮绿。也就是說,想要通過一份代碼同時編譯出三個應(yīng)用安裝到設(shè)備中攀例,我們需要在 dev.xcconfig
, qa.xcconfig
, prod.xcconfig
中分別定義 BUNDLE_IDENTIFIER
船逮,并在項(xiàng)目配置中引用它。
當(dāng)我們直接在配置中定義 PE_BUNDLE_ID
粤铭,并在項(xiàng)目配置中引用它時(Xcode10.1 (10B61))挖胃,會發(fā)現(xiàn)配置無效(如下圖)
當(dāng)查看 info.plist
時箱锐,可以發(fā)現(xiàn) Bundle identifier
的 value 是 $(PRODUCT_BUNDLE_IDENTIFIER)
派哲。 我們可以在 Project -> Build Settings -> Product Bundle Identifier
中配置它的值為 $(PE_BUNDLE_ID)
镊折。具體操作如下圖:
最終效果
完成上述配置以后抡秆,我們可以在不同 Scheme 下執(zhí)行 run 命令將 APP 安裝到模擬器中,查看效果:
What's More
如果你需要在 Jenkins 或者 Travis 中搭建 pipeline逮壁,此配置同樣適用村斟。
當(dāng)我們用腳本來打包 APP 時奶陈,會執(zhí)行如下命令:
xcodebuild archive -workspace 項(xiàng)目名稱.xcworkspace
-scheme scheme名稱
-archivePath archive包存儲路徑
CODE_SIGN_IDENTITY=證書
PROVISIONING_PROFILE=描述文件UUID
通過指定不同的 scheme 即可管理不同環(huán)境下的項(xiàng)目配置怯屉。
構(gòu)建 pipeline 將會在后續(xù)文章中詳細(xì)介紹蔚舀,敬請期待饵沧!