引用KB_MoreShare的http://www.code4app.com/blog-859519-884.html 這篇
寫的很好,很詳細?
內容==================================================================
談到多環境,相信現在大多公司都至少有2-3個app環境了,比如Test環境,預發環境環境,Release環境等等。當需要開發打多個包的時候,一般常見做法就是直接代碼里面修改環境變量,改完之后Archive一下就打包了。當然這種做法很正確,只不過不是很優雅很高效。如果搭建好了Jenkins(搭建教程),我們利用它來優雅的打包。如果利用Jenkins來打包,我們就需要來給app來配置一下多個環境變量了。之后Jenkins分別再不同環境下自動集成即可。所以也方便了很多。
一.利用Build Configuration來配置多環境
由于需要配置多個環境,并且多個環境都需要安裝到手機上,那么可以配置Build Configuration來完成這個任務。如果Build Configuration還不熟悉的,可以先溫習一下官方文檔。
先點擊Project里面找到Configuration,然后選擇添加,這里新加一個Configuration。系統默認是2個,一個Debug,一個Release。這里我們需要選擇是復制一個Debug還是Release。Release和Debug的區別是,Release是不能調試程序,因為默認是屏蔽了可調試的一些參數,具體可以看BuildSetting里面的區別,而且Release編譯時有做編譯優化,會比用Debug打包出來的體積更小一點。
這里我們選擇一個Duplicate “Debug” Configuration,因為我們新的環境需要debug,添加完了之后就會多了一套Configuration了,這一套其實是包含了一些編譯參數的配置集合。如果此時項目里面有cocopods的話,打開Configuration Set就會發現是如下的樣子:
注意:剛剛新建完Build Configuration之后,這時如果有pod,請立即執行一下
pod install
如果沒用pod,可以忽略一下這一段。
2. 新建User-defined Build Settings
再次回到Project的Build Settings里面來,Add User-Defined Setting。
我們這里新加入2個參數,CustomAppBundleld是為了之后打包可以分開打成多個包,這里需要3個不同的Id,建議是直接在原來的Bundleld加上Configuration的名字即可。
CustomProductName是為了app安裝到手機上之后,手機上顯示的名字,這里可以按照對應的環境給予描述,例如:測試,線上等等。
修改info.plist文件 和 Images.xcassets
由于我們新添加了2個CustomAppBundleld 和 CustomProductName,這里我們需要把info.plist里面的Bundle display name修改成我們自定義的這個字典。編譯過程中,編譯器會根據我們設置好的Scheme去自己選擇Debug,Release,TestRelease分別對應的ProductName,如下圖所示:
3. 配置和獲取環境變量
接下來講幾種動態配置環境變量的方法
1. 使用GCC預編譯頭參數GCC_PREPROCESSOR_DEFINITIONS
我們進入到Build Settings里面,可以找到Apple LLVM Preprocessing,這里我們可以找到Preprocessor Macros在這里,我們是可以加一些環境變量的宏定義來標識符。Preprocessor Macros可以根據不同的環境預先制定不同定義的宏。
如上圖,AdHoc = 1 ,DEBUG = 1 ,RELEASE = 1;
有了這些我們預先設置的標識符之后,我們就可以在代碼里面寫入如下的代碼了。同時可以配置不同的環境的域名,統計,很多參數在不同環境的配置。
我們可以選擇工程中的Config,然后點擊Edit scheme, 如圖所示:
然后在運行時,就可以選擇Run,Info -> Buidl Configuration 中就可以看到之前設置的Debug , AdHoc , Relaese ,這樣就可以配置不同的環境了,不同參數的設定都可以根據自定義的進行配置,如果打包,也可以選擇Archive,Build configuration 中也可以設置Debug , AdHoc ,Release等環境。
選擇不同的run 的Configuration,運行如下結果,
主要的坑就是,在新加入一個環境后,比如這里的ADHoc 環境, 你如果項目中引入的cocopod, pod 文件夾里面有加入第三方框架的時候,一定記得要pod install一次,不然編譯就報錯!
還有就是切換環境的時候
#ifdef DEBUG
#define ABC @"我是debug的demo"
#elif ADHoc ? ? ? ? ? ? ? ? ? ? ?//這里的ADHoc 應該和你Preprocessor Macros 里面設置的一樣
#define ABC @"我是ADHoc的demo"
#else
#define ABC @"我是release的demo"
#endif
比如下面這樣