前言
在App開發(fā)過程中, 配置參數(shù)經(jīng)常會隨著環(huán)境的變化而不同.
例如基本的URL地址, 第三方秘鑰和key等等.
以往為了切換環(huán)境, 都是手動的注釋對應的參數(shù). 還要配置很多宏定義, 以及很多的#ifdef #endif判斷.
這種手動切換配置的方法, 即耽誤時間, 又影響代碼的可讀性. 因此需要更簡潔的動態(tài)修改方案.
開發(fā)環(huán)境
- macOS Ventura 13.4
- Xcode 14.3
環(huán)境配置方案
- 多target形式
- 多scheme方式
- xcconfig配置文件的形式
以上3種環(huán)境配置方案都可以達到動態(tài)修改的效果, 經(jīng)過各種嘗試, 個人認為xcconfig是最優(yōu)解決方案, 而且更符合個人的開發(fā)習慣, 但是需要進行很多地方的配置. 因此詳細講解一下如何配置.
具體操作步驟
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文件配置到對應的Configuartion中(OC & Swift)
切換到PROJECT -> info -> Configuartion下, 已經(jīng)配置了Debug和Release模式. 這是項目里默認的

因為我們有多個環(huán)境的配置, 原有的Debug和Release已經(jīng)無法滿足需求, 所以, 根據(jù)之前創(chuàng)建的xcconfig文件,點擊+號添加新的Debug和Release, 并且重新命名.
同時把紅框內(nèi)的選項, 選擇創(chuàng)建的xcconfig文件, 要一一對應. 其他選項選擇None.

項目是cocoapods管理, 在終端pod install 命令, 生成相關文件.
會發(fā)現(xiàn), 之前選擇None的選項自動選擇新生產(chǎn)的文件.
4. 創(chuàng)建新的Scheme(OC & Swift)
創(chuàng)建New Scheme 命名SchemeSit

Build Configuartion選擇對應的xcconfig文件

5. 在xcconfig文件中定義相應的變量(OC & Swift)
Debug或Release中添加的變量
其中導入pod對應的xcconfig是根據(jù)之前pod install 時生成的文件路徑
// 應用名字
APP_DISPLAY_NAME = 開發(fā)DEBUG
// 基礎URL ( // 中間要加上$() )
// OC寫法
BASE_URL = @"https:/$()/www.baidu.com"
// Swift寫法
BASE_URL = https:/$()/www.baidu.com
// 圖標名
APP_ICON = AppIcon
// 導入pod對應的config
#include "Pods/Target Support Files/Pods-SchemeCode/Pods-SchemeCode.debug.xcconfig"
// 導入公共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)境下, 自動切換對應的環(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. 設置特定的變量
-
設置不同應用名TARGETS -> General -> Identity -> Display Name
填寫${APP_DISPLAY_NAME}
設置應用名.jpg -
設置不同應用圖標
在Assets.xcassets中添加所需要的圖標,命名Appicon / AppiconSit
TARGETS -> Build Settings -> Primary App Icon Set Name
對應的環(huán)境選擇對應的應用圖標
應用圖標.jpg 設置不同應用Build Identifity
設置Build Identifity 不生效
手動設置Build Identifity后, 設置不同應用名發(fā)生錯誤.

