引用KB_MoreShare的http://www.code4app.com/blog-859519-884.html 這篇
寫的很好,很詳細(xì)?
內(nèi)容==================================================================
談到多環(huán)境,相信現(xiàn)在大多公司都至少有2-3個(gè)app環(huán)境了,比如Test環(huán)境,預(yù)發(fā)環(huán)境環(huán)境,Release環(huán)境等等。當(dāng)需要開發(fā)打多個(gè)包的時(shí)候,一般常見做法就是直接代碼里面修改環(huán)境變量,改完之后Archive一下就打包了。當(dāng)然這種做法很正確,只不過不是很優(yōu)雅很高效。如果搭建好了Jenkins(搭建教程),我們利用它來優(yōu)雅的打包。如果利用Jenkins來打包,我們就需要來給app來配置一下多個(gè)環(huán)境變量了。之后Jenkins分別再不同環(huán)境下自動(dòng)集成即可。所以也方便了很多。
一.利用Build Configuration來配置多環(huán)境
由于需要配置多個(gè)環(huán)境,并且多個(gè)環(huán)境都需要安裝到手機(jī)上,那么可以配置Build Configuration來完成這個(gè)任務(wù)。如果Build Configuration還不熟悉的,可以先溫習(xí)一下官方文檔。
先點(diǎn)擊Project里面找到Configuration,然后選擇添加,這里新加一個(gè)Configuration。系統(tǒng)默認(rèn)是2個(gè),一個(gè)Debug,一個(gè)Release。這里我們需要選擇是復(fù)制一個(gè)Debug還是Release。Release和Debug的區(qū)別是,Release是不能調(diào)試程序,因?yàn)槟J(rèn)是屏蔽了可調(diào)試的一些參數(shù),具體可以看BuildSetting里面的區(qū)別,而且Release編譯時(shí)有做編譯優(yōu)化,會(huì)比用Debug打包出來的體積更小一點(diǎn)。

這里我們選擇一個(gè)Duplicate “Debug” Configuration,因?yàn)槲覀冃碌沫h(huán)境需要debug,添加完了之后就會(huì)多了一套Configuration了,這一套其實(shí)是包含了一些編譯參數(shù)的配置集合。如果此時(shí)項(xiàng)目里面有cocopods的話,打開Configuration Set就會(huì)發(fā)現(xiàn)是如下的樣子:

注意:剛剛新建完Build Configuration之后,這時(shí)如果有pod,請(qǐng)立即執(zhí)行一下
pod install
如果沒用pod,可以忽略一下這一段。
2. 新建User-defined Build Settings
再次回到Project的Build Settings里面來,Add User-Defined Setting。

我們這里新加入2個(gè)參數(shù),CustomAppBundleld是為了之后打包可以分開打成多個(gè)包,這里需要3個(gè)不同的Id,建議是直接在原來的Bundleld加上Configuration的名字即可。
CustomProductName是為了app安裝到手機(jī)上之后,手機(jī)上顯示的名字,這里可以按照對(duì)應(yīng)的環(huán)境給予描述,例如:測(cè)試,線上等等。

修改info.plist文件 和 Images.xcassets
由于我們新添加了2個(gè)CustomAppBundleld 和 CustomProductName,這里我們需要把info.plist里面的Bundle display name修改成我們自定義的這個(gè)字典。編譯過程中,編譯器會(huì)根據(jù)我們?cè)O(shè)置好的Scheme去自己選擇Debug,Release,TestRelease分別對(duì)應(yīng)的ProductName,如下圖所示:

3. 配置和獲取環(huán)境變量
接下來講幾種動(dòng)態(tài)配置環(huán)境變量的方法
1. 使用GCC預(yù)編譯頭參數(shù)GCC_PREPROCESSOR_DEFINITIONS
我們進(jìn)入到Build Settings里面,可以找到Apple LLVM Preprocessing,這里我們可以找到Preprocessor Macros在這里,我們是可以加一些環(huán)境變量的宏定義來標(biāo)識(shí)符。Preprocessor Macros可以根據(jù)不同的環(huán)境預(yù)先制定不同定義的宏。

如上圖,AdHoc = 1 ,DEBUG = 1 ,RELEASE = 1;
有了這些我們預(yù)先設(shè)置的標(biāo)識(shí)符之后,我們就可以在代碼里面寫入如下的代碼了。同時(shí)可以配置不同的環(huán)境的域名,統(tǒng)計(jì),很多參數(shù)在不同環(huán)境的配置。

我們可以選擇工程中的Config,然后點(diǎn)擊Edit scheme, 如圖所示:

然后在運(yùn)行時(shí),就可以選擇Run,Info -> Buidl Configuration 中就可以看到之前設(shè)置的Debug , AdHoc , Relaese ,這樣就可以配置不同的環(huán)境了,不同參數(shù)的設(shè)定都可以根據(jù)自定義的進(jìn)行配置,如果打包,也可以選擇Archive,Build configuration 中也可以設(shè)置Debug , AdHoc ,Release等環(huán)境。

選擇不同的run 的Configuration,運(yùn)行如下結(jié)果,

主要的坑就是,在新加入一個(gè)環(huán)境后,比如這里的ADHoc 環(huán)境, 你如果項(xiàng)目中引入的cocopod, pod 文件夾里面有加入第三方框架的時(shí)候,一定記得要pod install一次,不然編譯就報(bào)錯(cuò)!
還有就是切換環(huán)境的時(shí)候
#ifdef DEBUG
#define ABC @"我是debug的demo"
#elif ADHoc ? ? ? ? ? ? ? ? ? ? ?//這里的ADHoc 應(yīng)該和你Preprocessor Macros 里面設(shè)置的一樣
#define ABC @"我是ADHoc的demo"
#else
#define ABC @"我是release的demo"
#endif
比如下面這樣
