前言
在App開發(fā)過程中, 配置參數(shù)經(jīng)常會隨著環(huán)境的變化而不同.
例如基本的URL地址, 第三方秘鑰和key等等.
以往為了切換環(huán)境, 都是手動的注釋對應(yīng)的參數(shù). 還要配置很多宏定義, 以及很多的#ifdef #endif判斷.
這種手動切換配置的方法, 即耽誤時間, 又影響代碼的可讀性. 因此需要更簡潔的動態(tài)修改方案.
開發(fā)環(huán)境
- macOS Ventura 13.4
- Xcode 14.3
環(huán)境配置方案
- 多target形式
- 多scheme方式
- xcconfig配置文件的形式
以上3種環(huán)境配置方案都可以達(dá)到動態(tài)修改的效果, 經(jīng)過各種嘗試, 個人認(rèn)為xcconfig是最優(yōu)解決方案, 而且更符合個人的開發(fā)習(xí)慣, 但是需要進(jìn)行很多地方的配置. 因此詳細(xì)講解一下如何配置.
具體操作步驟
1. 創(chuàng)建一個新項目(OC & Swift)
首先創(chuàng)建一個新的項目, 并用cocoapods管理
2. 創(chuàng)建xcconfig配置文件(OC & Swift)
創(chuàng)建xcconfig文件夾:
創(chuàng)建Configuration Setting Flie文件:
根據(jù)項目的開發(fā)環(huán)境需求, 創(chuàng)建多個xcconfig文件, 這里演示的只有生產(chǎn)環(huán)境和開發(fā)環(huán)境(Sit):
注釋: 此處一定要記得選擇Targets. 如果忘記了, 不要緊, 點擊創(chuàng)建的xcconfig文件, 在Target Membership中勾選
3.將xcconfig文件配置到對應(yīng)的Configuartion中(OC & Swift)
切換到PROJECT -> info -> Configuartion下, 已經(jīng)配置了Debug和Release模式. 這是項目里默認(rèn)的
因為我們有多個環(huán)境的配置, 原有的Debug和Release已經(jīng)無法滿足需求, 所以, 根據(jù)之前創(chuàng)建的xcconfig文件,點擊+號添加新的Debug和Release, 并且重新命名.
同時把紅框內(nèi)的選項, 選擇創(chuàng)建的xcconfig文件, 要一一對應(yīng). 其他選項選擇None.
項目是cocoapods管理, 在終端pod install 命令, 生成相關(guān)文件.
會發(fā)現(xiàn), 之前選擇None的選項自動選擇新生產(chǎn)的文件.
4. 創(chuàng)建新的Scheme(OC & Swift)
創(chuàng)建New Scheme 命名SchemeSit
Build Configuartion選擇對應(yīng)的xcconfig文件
5. 在xcconfig文件中定義相應(yīng)的變量(OC & Swift)
Debug或Release中添加的變量
其中導(dǎo)入pod對應(yīng)的xcconfig是根據(jù)之前pod install 時生成的文件路徑
// 應(yīng)用名字
APP_DISPLAY_NAME = 開發(fā)DEBUG
// 基礎(chǔ)URL ( // 中間要加上$() )
// OC寫法
BASE_URL = @"https:/$()/www.baidu.com"
// Swift寫法
BASE_URL = https:/$()/www.baidu.com
// 圖標(biāo)名
APP_ICON = AppIcon
// 導(dǎo)入pod對應(yīng)的config
#include "Pods/Target Support Files/Pods-SchemeCode/Pods-SchemeCode.debug.xcconfig"
// 導(dǎo)入公共config
#include "CommonConfig.xcconfig"
常用配置文件中, 要把xcconfig中的變量Key值書寫到這里.
GCC_PREPROCESSOR_DEFINITIONS = ${inherited} APP_DISPLAY_NAME='$(APP_DISPLAY_NAME)'
BASE_URL='$(BASE_URL)'
BUNDLE_ID='$(BUNDLE_ID)'
APP_ICON='$(APP_ICON)'
此時我們能在TARGETS -> Build Settings -> User-Defined 中看見自定義的變量
6. 讀取自定義變量(OC & Swift 不同)
切換Scheme即可在不同開發(fā)環(huán)境下, 自動切換對應(yīng)的環(huán)境變量
OC讀取自定義變量: 可以直接以宏定義的形式獲取所需要的自定義變量.
NSLog(BASE_URL);
Swift讀取自定義變量: 由于Swift沒有了OC中的宏定義, 所以獲取自定義變量如下
func readBaseUrl() -> String? {
guard let path = Bundle.main.path(forResource: "Info", ofType: "plist") else {
return nil
}
let infoDic = NSDictionary(contentsOfFile: path)
let host = infoDic?["BASE_URL"] as? String
return host
}
print(readBaseUrl()!)
7. 設(shè)置特定的變量
-
設(shè)置不同應(yīng)用名TARGETS -> General -> Identity -> Display Name
填寫${APP_DISPLAY_NAME}
-
設(shè)置不同應(yīng)用圖標(biāo)
在Assets.xcassets中添加所需要的圖標(biāo),命名Appicon / AppiconSit
TARGETS -> Build Settings -> Primary App Icon Set Name
對應(yīng)的環(huán)境選擇對應(yīng)的應(yīng)用圖標(biāo)
設(shè)置不同應(yīng)用Build Identifity
設(shè)置Build Identifity 不生效
手動設(shè)置Build Identifity后, 設(shè)置不同應(yīng)用名發(fā)生錯誤.