本項(xiàng)目包含 “iOS App配置多環(huán)境變量 + 使用fastlane快速打包并上傳蒲公英/AppStore”
GitHub:MultipleEnvironment
參考
需求:切換以下功能時(shí)無需修改代碼
- 切換服務(wù)器時(shí)。
- 開發(fā)、測試環(huán)境下的 “分享、統(tǒng)計(jì)” 等功能 使用開發(fā)渠道統(tǒng)計(jì)數(shù)據(jù),上線后才使用線上渠道統(tǒng)計(jì)。
- 開發(fā)、測試環(huán)境顯示全部功能,而正式上線時(shí)需服務(wù)端控制該功能的顯示/隱藏(例如:躲避蘋果的支付審核,測試環(huán)境下允許支付寶、微信、蘋果內(nèi)購 3種支付方式,而審核時(shí)只顯示蘋果內(nèi)購支付)(注:千萬不要試圖躲避內(nèi)購,否則蘋果生氣了后果很嚴(yán)重,親身體驗(yàn))
定義三個(gè)項(xiàng)目環(huán)境變量。
- dev: 開發(fā)
- adhoc: 測試
- appstore: 線上
可選方案:
- 利用Build Configuration來配置多環(huán)境
- 利用xcconfig文件來配置多環(huán)境
- 利用Targets來配置多環(huán)境
配置步驟:
根據(jù)本項(xiàng)目需求,采用最簡單輕量級(jí)的方案 "Build Configuration" 來配置多環(huán)境。
-
為 "dev", "adhoc", "appstore" 3種環(huán)境分別創(chuàng)建 Debug、Release版的Configuration。
- 在Xcode的 Project 里面找到 Configurations。
- dev: 將"Debug"改名為"dev-debug",將"Release"改名為"dev-release",
- adhoc: 點(diǎn)擊 "+" -> "Duplicate Debug Configuration",改名為 "adhoc-debug", 再點(diǎn)擊 "+" -> "Duplicate Release Configuration" 改名為 "adhoc-release"。 這里使用 Duplicate,如果項(xiàng)目已經(jīng)安裝過cocoapods,則會(huì)把對(duì)應(yīng) Debug、Release環(huán)境下的配置一并拷貝過來。
-
appstore: 同"adhoc"。
注意:如果使用了cocoapods,完成后需要pod install一下。
configurations_1.jpg
configurations_2.jpg -
選中 "對(duì)應(yīng)的Target" -> "Build Settings" -> "Active Compilation Conditions(Swift版,如果是OC,則是Preprocessor Macros)" 為不同環(huán)境配置不同的宏定義。(系統(tǒng)默認(rèn)已在Debug環(huán)境下帶有“DEBUG”標(biāo)志)
- dev-debug: DEBUG dev
- dev-release: dev
- adhoc-debug: DEBUG adhoc
- adhoc-release: adhoc
- appstore-debug: DEBUG appstore
- appstore-release: appstore
這樣做比較靈活,項(xiàng)目中就可以自由組合 DEBUG、dev、adhoc、appstore 來判斷環(huán)境條件了。
compilation_conditions.jpg -
配置Scheme。
- 新建3個(gè)Scheme,"New Scheme", 名字可以為“工程名+ dev、adhoc、appstore等后綴”,自己看得懂就行。
- 創(chuàng)建后要勾選shared選項(xiàng),這樣該scheme才會(huì)加入到git中,與他人共享,然后可以刪掉最開始那個(gè)無用的Scheme了。
- "Edit Scheme",需要為每個(gè)Scheme的 "Run", "Test", "Archive"... 之類的 配置 "Build Configuration",按需選則對(duì)應(yīng)的。
例如 系統(tǒng)默認(rèn)對(duì)應(yīng)的 Debug、Release如下
dev: "Run" - "dev-debug"
"Test" - "dev-debug"
"Profile" - "dev-release"
"Analyze" - "dev-debug"
"Archive" - "dev-release"
代碼中的使用:
- 配置不同服務(wù)器地址
#if dev
let ServerURL = "http://aaa.com"
#elseif adhoc
let ServerURL = "http://bbb.com"
#elseif appstore
let ServerURL = "http://ccc.com"
#endif
- 開發(fā)、測試環(huán)境下,配置渠道。
#if dev || adhoc
channel = "development"
#else
channel = "appstore"
#endif
- Debug && dev環(huán)境下添加額外功能
#if DEBUG && dev
// add some feature
#endif
使用:
需要切換環(huán)境時(shí),直接選中對(duì)應(yīng)的Scheme,run就好了。
補(bǔ)充:
如果想在同一部手機(jī)上安裝多個(gè)不同環(huán)境下的相同App,可選擇 "對(duì)應(yīng)Target" -> "Build Settings" -> "+" -> "Add User-Defined Setting" 為不同Scheme配置不同包名、應(yīng)用名、應(yīng)用圖標(biāo)等,但是要注意,如果App里中有和 包名bundle Id相關(guān)的配置,則要小心了,例如推送證書,它指定推送到對(duì)應(yīng)bundle id的應(yīng)用上(親身踩坑)。 此時(shí)簡單的使用 "Build Configuration" 則無法滿足需求,可選擇 多Targets來配置多環(huán)境、多證書之類。
fastlane自動(dòng)打包上傳
使用fastlane快速打包并上傳蒲公英/AppStore這篇文章寫得非常清晰詳細(xì)了。我的fastlane配置文件已經(jīng)在項(xiàng)目中了 /fastlane/Fastfile。更多fastlane的actions信息可以在fastlane actions文檔中查看
在項(xiàng)目根目錄下使用:
- "fastlane dev": 打開發(fā)環(huán)境的包并上傳蒲公英
- "fastlane adhoc": 打測試環(huán)境的包并上傳蒲公英
- "fastlane release": 打正式包并提交到"https://appstoreconnect.apple.com"上。
其中 "fastlane release"正式包還需配置/fastlane/Appfile中的 "App Store Connect Team ID"和"Developer Portal Team ID"。(注意這里使用 release而不是appstore字段,是因?yàn)閍ppstore字段已經(jīng)被fastlane作為其他用途了)
補(bǔ)充:打包后,在項(xiàng)目根目錄下會(huì)出現(xiàn) ipa包,它已被.gitignore忽略,并且 每次打新包都會(huì)自動(dòng)覆蓋舊ipa包。通過fastlane打的包也會(huì)出現(xiàn)在 Xcode的Organizer中.
使用Jenkins持續(xù)集成
本項(xiàng)目未使用,可參閱利用Jenkins持續(xù)集成iOS項(xiàng)目