轉(zhuǎn)自: http://www.itdecent.cn/p/9b8bc8351223
app開(kāi)發(fā)中通常都會(huì)涉及到多個(gè)環(huán)境,Debug、Release等。環(huán)境切換時(shí)可能就會(huì)涉及到服務(wù)器url的切換,或者一些第三方sdk的appid的切換。最初我是通過(guò)在代碼中添加變量的方式來(lái)設(shè)置環(huán)境的:
static let isRelease = true
static let serverURL = isRelease ? "prod server url" : "dev server url"
然而這樣做的缺陷是,每一次要切換環(huán)境的時(shí)候都需要去更改這個(gè)變量,多次修改后還是會(huì)比較煩。并且通常開(kāi)發(fā)中可能會(huì)有不止兩個(gè)環(huán)境。所以,配置app環(huán)境變量能夠更好的解決環(huán)境切換的問(wèn)題。
配置app環(huán)境變量的方式有多種,我選擇了一種我感覺(jué)比較直觀的方式來(lái)配置——使用xcconfig文件。
需求
Xcode默認(rèn)會(huì)提供兩種配置環(huán)境:Debug 和 Release,這兩者的區(qū)別:
- Debug 會(huì)多一些調(diào)試信息(網(wǎng)上很多人說(shuō)release,環(huán)境下不能斷點(diǎn)之類(lèi)的,自己測(cè)試后發(fā)現(xiàn)斷點(diǎn)什么的和debug、release沒(méi)有關(guān)系,后面會(huì)詳細(xì)說(shuō))
- Release 運(yùn)行速度快很多,流暢。打的包大小可能要比debug小一些
在我的開(kāi)發(fā)中主要是會(huì)用到3種環(huán)境:
- 測(cè)試服務(wù)器debug
- 偶爾會(huì)切換到正式服務(wù)器debug
- 上架(正式服務(wù)器,release)
默認(rèn)提供的兩種還不太夠用。。。
根據(jù)以上需求,操作步驟大致如下:
1、添加Build Configuration
打開(kāi)項(xiàng)目的workspace,進(jìn)入xcode的主界面。
選中主要工程的project -> info , 找到Configurations, 點(diǎn)擊下方的“+”

從圖中可以看到兩個(gè)已經(jīng)添加好的Configuration: Debug 和 Release
選擇“deplicate debug configuration”,添加一個(gè)新的configuration,命名為ReleaseTest:

從圖上可以看到,三個(gè)configuration都已經(jīng)有了默認(rèn)的configuration set(也就是xxconfig文件)。這是因?yàn)槲业墓こ讨幸呀?jīng)包含了cocoapods。默認(rèn)的configuration set是pods添加的。
這個(gè)時(shí)候新增加的build configuration并沒(méi)有對(duì)應(yīng)的pods的xcconfig,所以項(xiàng)目會(huì)報(bào)錯(cuò)。把新建的configuration 對(duì)應(yīng)的set 設(shè)置為none

命令行運(yùn)行
pod install
完成之后如下圖

2、新建并配置xcconfig文件
common + "n", 選擇 iOS -> Other -> Configuration settings file

新建4個(gè)xxconfig文件,我采用一下命名:

其中:
CommonConfig.xcconfig 文件中放一些通用的配置,例如build version等
其他三個(gè)文件分別對(duì)應(yīng)三個(gè)build configuration.
在CommonConfig中添加:
BUILD_VERSION = 1.0.0
DebugConfig:
/*
導(dǎo)入公共 config
*/
#include "CommonConfig.xcconfig"
/*
導(dǎo)入pods 對(duì)應(yīng)的 config
*/
#include "Pods/Target Support Files/Pods/Pods.debug.xcconfig"
APP_DISPLAY_NAME = 測(cè)試服
CONFIG_FLAG = DEBUG
ReleaseConfig:
#include "CommonConfig.xcconfig"
#include "Pods/Target Support Files/Pods/Pods.release.xcconfig"
APP_DISPLAY_NAME = 真名
CONFIG_FLAG = RELEASE
ReleaseTestConfig:
#include "CommonConfig.xcconfig"
#include "Pods/Target Support Files/Pods/Pods.releasetest.xcconfig"
APP_DISPLAY_NAME = 正式服
CONFIG_FLAG = RELEASE_TEST
其中:
#include "Pods/Target Support Files/Pods/Pods.releasetest.xcconfig"
可能會(huì)因?yàn)轫?xiàng)目名稱(chēng)的不同導(dǎo)致路徑不同,如果不太確定的可以再次pod install。pods會(huì)給出提示,其中包含了正確的路徑。
[!] 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
configTesttoPods/Target Support Files/Pods/Pods.debug.xcconfigor include thePods/Target Support Files/Pods/Pods.debug.xcconfigin your build configuration.
完成以上后,把build configuration切換成對(duì)應(yīng)的新建的文件:

2、設(shè)置環(huán)境變量
完成上面的步驟就已經(jīng)添加好了環(huán)境,剩下的就是設(shè)置環(huán)境變量
在Info.plist文件中,設(shè)置Bundle name 為
${APP_DISPLAY_NAME}
應(yīng)用的名稱(chēng)就會(huì)根據(jù)配置改變了。

然而在代碼中需要根據(jù)環(huán)境改變某些變量的值怎么辦呢?
1、設(shè)置預(yù)編譯頭參數(shù)
OC
Project -> Build settings -> Apple LLVM 7.1 - Preprocessing
在 preprocessor 中添加
${CONFIG_FLAG}=1

Swift
Project -> Build settings -> Swift Compiler - Custom Flags
在 other swift flags 中添加
-D ${CONFIG_FLAG}

然后
代碼中:
struct AppConfig {
private enum AppConfigType {
case Debug
case Release
case ReleaseTest
}
private static var currentConfig: AppConfigType {
#if DEBUG = 1
return .Debug
#elseif RELEASE_TEST = 1
return .ReleaseTest
#else
return .Release
#endif
}
static var webServerURL: String {
switch currentConfig {
case .Debug:
return "test url"
default:
return "release url"
}
}
}
其他變量也可以采用以上方式配置。
添加多個(gè)scheme,方便配置切換


在scheme中改變build configuration即可實(shí)現(xiàn)不同的環(huán)境切換,也可以添加多個(gè)scheme實(shí)現(xiàn)更方便的切換


添加的新scheme需要在manage scheme中勾選shared,git上的其他人才能看到新scheme
