一般來說,我們項目中,默認建好是只有一個target的(UItests等除外),但是,一些場景中,多target能幫助我們更好的使用項目。
比如以下場景
- 同一項目,一般會分不同環(huán)境:開發(fā)環(huán)境、測試環(huán)境、正式(生產(chǎn))環(huán)境,內(nèi)網(wǎng)環(huán)境 ,外網(wǎng)環(huán)境等,這就涉及到一個請求接口的區(qū)別,一般我們可能會定義多個,每次切換環(huán)境,就用代碼注釋解決是可以完成, 但是很便捷.我們?nèi)绻捎肨arget來解決就會便利很多.
- 同一產(chǎn)品會有多種客戶端構成,現(xiàn)在有很多這種場景下的項目,類似美團外賣商家和用戶客端,教學項目的學生端和教師端等,淘寶的客戶端,商家端等等情況
這種項目,會生成多個App,但其中很多東西可以共用,如果在一個項目里創(chuàng)建管理,會更好更方便。
基于以上原因,我們有必要研究一下多個Target的管理和使用.
- 同一產(chǎn)品會有多種客戶端構成,現(xiàn)在有很多這種場景下的項目,類似美團外賣商家和用戶客端,教學項目的學生端和教師端等,淘寶的客戶端,商家端等等情況
準備工作
創(chuàng)建一個Project 命名為MYDemo,項目默認為我們創(chuàng)建了一個Target,名字為c
添加2個Target
選中target,右鍵選擇Duplicate就會添加一個target
重復來一次再加1個target
你會發(fā)現(xiàn)多了2個target 和2個info.plist

屏幕快照 2017-10-18 下午3.29.17.png
你會發(fā)現(xiàn)2個target和info.plist的名字都是帶有copy的 不滿意要修改稱自己想要的,進行以下操作
- 1 改target名字和Scheme
點擊左上角模擬器左邊的target選擇項,
選擇Manage Schems

屏幕快照 2017-10-18 下午3.34.01.png
改成自己想要的名字,這里我們未來便于區(qū)分理解 ,是以MYDemo-dev ,MYDemo-test來命名的

屏幕快照 2017-10-18 下午3.36.42.png
- 2 修改info.plist名字
這個簡單直接在文件名上改,為了統(tǒng)一管理名字還是以MYDemo-dev ,MYDemo-test來命名的

屏幕快照 2017-10-18 下午3.41.45.png
配置不同環(huán)境
在build setting 中搜索Macros
然后在Preprocessor Macros 添加預編譯宏WD_Environment_Mode
- 0 生產(chǎn)環(huán)境 WD_Environment_Mode==0
- 1 開發(fā)環(huán)境 WD_Environment_Mode==1
- 2 測試環(huán)境 WD_Environment_Mode==2
注意三個target都要配置

0099D639-C536-447B-8969-4CF3F16A9482.png
這樣我們就可以在項目中根據(jù)WD_Environment_Mode來判斷切換不同的環(huán)境了
下面做個測試
給項目添加個pch 文件 ,這個pch添加配置就不多講了.
在pch 中 添加一些預編譯指令
#ifdef WD_Environment_Mode
#if WD_Environment_Mode==0
#define MAR_KeyK @"222"
#elif WD_Environment_Mode ==1
#define MAR_KeyK @"333"
#elif WD_Environment_Mode ==2
#define MAR_KeyK @"444"
#endif
然后我們在控制器的viewDidLoad 里面添加如下代碼
運行不同的target看結果
NSLog(@"---kye%@",MAR_KeyK);
switch (WD_Environment_Mode) {
case 0:
NSLog(@"生產(chǎn)00");
break;
case 1:
NSLog(@"開發(fā)01");
break;
case 2:
NSLog(@"測試02");
break;
default:
break;
}
-
0 生產(chǎn)環(huán)境
結果如下
8836EB4F-5A1E-460C-A989-B4FBE001D8A5.png 1 開發(fā)環(huán)境

- 2 測試環(huán)境

9D8165D5-C3E2-4EAF-B86C-64D200CF78CB.png
總結: 這樣不用去手動注釋修改代碼 只需要切換target 是不是很方便給力呢?
