引入
記得之前說過一遍關於通過配置xcconfig文件,各取Debug與Release同一個宏的參數值的文章,特別是在不同的環境,測試環境Api與正式環境Api的區別,但是如果一個項目,有線上版本,有內測版本,有開發版本等等,或者有各種不同環境的Api,不同的環境下,宏值的區分,這時候用多Target最為合適不過;在發版時,選中生產Target編譯打包;舉個例子,如果一個項目Api有三個環境值要區分:
///生產 #define API_URL @"http://www.xkapi.com/" ///內測 #define API_URL @"http://www.xkapi0000.com/" ///本地 #define API_URL @"http://1.1.1.12:0000/"
你可能會將上面的代碼寫在PCH文件或者PCH引用的頭文件里面,然后其他用不到的兩個,注釋掉,這種方式有一定的缺點:
每次修改PCH文件里面的引用與宏,項目重新編譯會比較慢
頻繁切換同一個宏,在正式發版打包時,會偶爾失誤或者忘記是否變更到了生產Api
這時候可以為項目創建Target,用現有的默認Target作為生產環境,再分別創建一個內測、本地開發環境Target,打包時用生產Target直接打包,需要什么環境的Api,直接切換到不同的Target編譯運行即可。
創建Target
點擊項目名稱,可以看到TARGETS里面的Target,默認一個,右鍵點擊默認的Target名稱,然后點擊Duplicate,直接復制一個現有的Target,這里直接復制兩個,然后對新建的兩個Target分別重命名,用DEV作為本地開發環境,BETA作為內測環境,然后會發現,在新建Targe的同時,系統新創建了info.plist,其實不同的Target,可配置不同的info.plist文件,但是也可直接刪除這兩個info.plist文件,后面直接再引用默認的info.plist就行;
配置info.plist
新Target刪除了默認的info.plist文件后,選中新Target會提示讓選擇info.plist文件,點擊選擇info.plist文件,會彈出選擇框,只需要將項目一開始默認的Target的info.plist配置到新的Target上就可以了,選好后,切換下不同的Target就可以看到項目名稱,版本號編譯號等等;也可以通過選中Target 點擊Build Settings,然后搜索 packaging,可以在info.plist File選中配置即可,將兩個新建的Target都進行配置;
配置Target環境參數
為了能在使用不同的Target編譯,讓系統自動獲取不同的Target環境下配置宏 Api 的值,我們需要為每一個Target配置一個共同的參數,並賦予不同的值,來區分不同的Target,參數名可自定義,但每個Target必須同一個參數名,這里使用 DEVELOP_ENV 參數作為示例,參數添加:
1、選中Target,點擊Build Settings 搜索 preprocessing 2、找到 Preprocessor Macros 3、雙擊 Preprocessor Macros 后面的空白區域 4、在彈出的彈框中,點擊下面的“+”號,添加 DEVELOP_ENV 參數並賦值
按照步驟為每一個Target都添加 DEVELOP_ENV 參數,生產環境參數值為1,本地開發環境參數值為0,內測環境參數值為2,至此環境參數宏配置完成
修改 Podfile 文件(未使用Pod忽略)
在未添加多Target時,pod只為一個Target服務,那么就需要稍微改一下 Podfile文件,讓pod為每個Target服務
修改前的Podfile文件內容
platform :ios, '10.0' source 'https://github.com/CocoaPods/Specs.git' inhibit_all_warnings! target 'XKProject' do pod 'MJRefresh' end
修改后的Podfile文件內容
platform :ios, '10.0' source 'https://github.com/CocoaPods/Specs.git' inhibit_all_warnings! targets = ['XKProject','XKProject-DEV','XKProject-BETA'] #循環 targets.each do |t| target t do pod 'MJRefresh' end end
多Target使用
圍繞剛開始的目的說說,不同環境,系統使用自定義宏 Api 的值不同,現在修改PCH或PCH引用的頭文件里的 API宏
修改宏
修改前
///生產
#define API_URL @"http://www.xkapi.com/"
///內測
//#define API_URL @"http://www.xkapi0000.com/"
///本地
//#define API_URL @"http://1.1.1.12:0000/"
修改后
///生產、線上 - 對應Target DEVELOP_ENV參數值
#define ENV_PRO 1
///開發 - 對應Target DEVELOP_ENV參數值
#define ENV_DEV 0
///內側 - 對應Target DEVELOP_ENV參數值
#define ENV_BETA 2
#if DEVELOP_ENV == ENV_PRO
///生產
#define API_URL @"http://www.xkapi.com/"
#elif DEVELOP_ENV == ENV_DEV
///開發
#define API_URL @"http://1.1.1.12:0000/"
#else
///內測
#define API_URL @"http://www.xkapi0000.com/"
#endif
編譯測試
選中開發環境Target(XKProject-DEV),編譯后運行,打印 API_URL
打印結果
http://1.1.1.12:0000/
選中內測環境Target(XKProject-BETA),編譯后運行,打印 API_URL
打印結果
http://www.xkapi0000.com/
選中生產環境Target(XKProject),編譯后運行,打印 API_URL
打印結果
http://www.xkapi.com/
注意事項
項目中使用多Target后,在創建類文件時,默認文件會自動添加到默認Target,需要手動勾選其他Target;