很多專案在開發時都會經常在開發環境和生產環境之間切換,切換隨之伴來的還有比如更換 App 名稱、Bundle identitier、服務端介面地址等等相關引數和屬性,這個時候我們就可以利用 Xcode 提供的 Configuration 來配置不同的環境,從而進行快速切換、編譯等等一系列操作。
注: Xcode 中 Build Settings 的所有項都可以針對不同的 Configuration 設定不同的值
使用不同的環境配置進行除錯
定義好不同的環境後,你就可以分別設定 run
、test
、Archive
... 這些操作分別使用哪一個 Build Configuration 進行編譯,從而可以很輕鬆得分離開各個配置環境的設定。比如分離不同的服務端開發和正式環境,就可以利用巨集定義進行引數區分(參見後文)輕鬆實現,然後開發的時候需要切換環境測試之類的就可以直接在 Edit Scheme 裡修改對應的 Configuration,不用再修改程式碼。
切換不同的 Bundle identifier
在 Targets -> Build Settings -> Packaging -> Product Bundle Identifier 中設定不同的值即可。
切換不同的 App Name
如果需要實現根據 Configuration 設定不同的應用顯示名稱,可以通過增加 User-Define 屬性實現,甚至可以直接使用 Product Name,這裡說一下前者的設定方法。
在 Targets -> Build Settings 頂部 "+" 按鈕彈出選單中選擇 "Add User-Defined Setting" 來增加一項 User-Defined 屬性,值可以自己隨意設定,名稱可以叫 "BUNDLEDISPLAY_NAME",然後在 "xxx-Info.plist" 中的 Bundle display name 項中設定值為 ${BUNDLE_DISPLAY_NAMEAA},搞定!
利用巨集定義進行引數區分
如果想在程式碼中對不同環境進行各自的引數載入或者操作處理,我們可以通過預處理巨集來判斷,通過給 Configuration 增加巨集定義和 #ifdef
預處理命令就可以實現。
比如我們要給一個名為 DebugBeta 的 Configuration 設定載入非正式環境的服務端介面地址,在 Targets -> Build Settings -> Preprocessor Macros 中給 DebugBeta 設定一個特殊標識就行了,比如 "BETASERVERURL=1"。
然後通過預處理程式碼進行判斷就可以實現載入不同的引數項,比如還可以設定一些 SDK 區分正式/開發環境的 Key,做一些非常靈活的操作。
NSString *serverURL;
#ifdef BETASERVERURL
serverURL = @"http://xxx";
#else
serverURL = @"http://yyy";
#endif複製程式碼
Cocoapods 可能會遇到的問題
定義好自己的 Configuration 後,再執行 pod install
可能會遇到類似下面的警告資訊,這個時候只需要在 Project -> Info -> Configurations 中自定義的配置 'Based on Configuration File' 設為 None 就可以了。
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target
專案名
toPods/Target Support Files/Pods-專案名/Pods-專案名.release.xcconfig
or include thePods/Target Support Files/Pods-專案名/Pods-專案名.release.xcconfig
in your build configuration.