想象一個場景,我們正在開發一款支付系統,這個支付系統同時支持有Web版和原生的iOS APP版本。
這個支付系統有三個環境:
- dev: 調用支付的開發環境接口,并不會真的扣錢。
- qa: 調用支付的測試環境接口,假的測試賬戶中的余額會發生變化。
- production: 調用產品環境中的支付接口,賬戶余額和錢會真實發生變化。
對于 Web 版的系統,我可以在瀏覽器中打開三個窗口,然后依次輸入不同環境下的域名: www.dev.pay-example.com
,www.qa.pay-example.com
,www.prod.pay-example.com
來分別進行測試。
對于 iOS APP 呢?我們想要的其實是類似的,打開一臺手機,我們可以同時安裝三個APP:PayExampleDev
,PayExampleQA
,PayExample
然后可以切換APP來使用它們。
那么怎樣通過一個 iOS 工程打包出三個不同的 APP 呢?方法很多,本文我們就來介紹通過 Xcode Configuration
和 Scheme
的配置方式來實現。
添加 Xcode Configuration
- 新建 Group,命名為:Configuration
- 在 Configuration 中新建不同環境下的 Configuration Settings file
具體步驟如下圖:
配置項目的 Configuration
- 在不同的 Configuration file 中,配置需要的鍵值對,用于在項目中引用,具體配置,請參考 Demo源碼
- Project -> Info -> Configurations
- 將 Configurations 配置為 Dev、QA、Prod,并配置對應的 Configuration File
具體步驟如下圖:
創建 scheme
- 創建 scheme (PayExampleDev、PayExampleQA、PayExampleProd),供不同環境使用
-
Edit Scheme -> Step -> Info -> Build Configuration
,配置對應的 Build Configuration 為Dev、QA、Prod
在項目配置中引用 xcconfig 中定義的變量
PayExample target -> General -> Display Name
- 配置 Display Name 為
$(PE_BUNDLE_NAME)
具體步驟如下圖:
在某一個 Scheme 上執行某操作時,在此 Scheme 的此步驟上定義的 BuildConfig 就會生效。
比如:
用于打包 QA 環境的scheme PayExampleQA
,其 Build 配置的 Build Configuration
為 QA
QA
在 Configuration
中配置的 config
文件為:qa.xcconfig
項目中,APP 的 Display Name 的值為:$(PE_BUNDLE_NAME)
qa.xcconfig
中 PE_BUNDLE_NAME
的值為 PayExampleQA
如此 PayExampleQA scheme 在打包后,顯示的APP名稱為 PayExampleQA
Setup bundle identifier
iOS 中是通過 bundle identifier
來標識不同的應用的。也就是說,想要通過一份代碼同時編譯出三個應用安裝到設備中,我們需要在 dev.xcconfig
, qa.xcconfig
, prod.xcconfig
中分別定義 BUNDLE_IDENTIFIER
,并在項目配置中引用它。
當我們直接在配置中定義 PE_BUNDLE_ID
,并在項目配置中引用它時(Xcode10.1 (10B61)),會發現配置無效(如下圖)
當查看 info.plist
時,可以發現 Bundle identifier
的 value 是 $(PRODUCT_BUNDLE_IDENTIFIER)
。 我們可以在 Project -> Build Settings -> Product Bundle Identifier
中配置它的值為 $(PE_BUNDLE_ID)
。具體操作如下圖:
最終效果
完成上述配置以后,我們可以在不同 Scheme 下執行 run 命令將 APP 安裝到模擬器中,查看效果:
What's More
如果你需要在 Jenkins 或者 Travis 中搭建 pipeline,此配置同樣適用。
當我們用腳本來打包 APP 時,會執行如下命令:
xcodebuild archive -workspace 項目名稱.xcworkspace
-scheme scheme名稱
-archivePath archive包存儲路徑
CODE_SIGN_IDENTITY=證書
PROVISIONING_PROFILE=描述文件UUID
通過指定不同的 scheme 即可管理不同環境下的項目配置。
構建 pipeline 將會在后續文章中詳細介紹,敬請期待!