iOS-多Target那些事兒

引入

記得以前說過一遍關於經過配置xcconfig文件,各取Debug與Release同一個宏的參數值的文章,特別是在不一樣的環境,測試環境Api與正式環境Api的區別,可是若是一個項目,有線上版本,有內測版本,有開發版本等等,或者有各類不一樣環境的Api,不一樣的環境下,宏值的區分,這時候用多Target最爲合適不過;在發版時,選中生產Target編譯打包;舉個例子,若是一個項目Api有三個環境值要區分:html

///生產
#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引用的頭文件裏面,而後其餘用不到的兩個,註釋掉,這種方式有必定的缺點:ios

每次修改PCH文件裏面的引用與宏,項目從新編譯會比較慢
頻繁切換同一個宏,在正式發版打包時,會偶爾失誤或者忘記是否變動到了生產Api

這時候能夠爲項目建立Target,用現有的默認Target做爲生產環境,再分別建立一個內測、本地開發環境Target,打包時用生產Target直接打包,須要什麼環境的Api,直接切換到不一樣的Target編譯運行便可。git

建立Target

點擊項目名稱,能夠看到TARGETS裏面的Target,默認一個,右鍵點擊默認的Target名稱,而後點擊Duplicate,直接複製一個現有的Target,這裏直接複製兩個,而後對新建的兩個Target分別重命名,用DEV做爲本地開發環境,BETA做爲內測環境,而後會發現,在新建Targe的同時,系統新建立了info.plist,其實不一樣的Target,可配置不一樣的info.plist文件,可是也可直接刪除這兩個info.plist文件,後面直接再引用默認的info.plist就行;github

配置info.plist

新Target刪除了默認的info.plist文件後,選中新Target會提示讓選擇info.plist文件,點擊選擇info.plist文件,會彈出選擇框,只須要將項目一開始默認的Target的info.plist配置到新的Target上就能夠了,選好後,切換下不一樣的Target就能夠看到項目名稱,版本號編譯號等等;也能夠經過選中Target 點擊Build Settings,而後搜索 packaging,能夠在info.plist File選中配置便可,將兩個新建的Target都進行配置;api

 

 配置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,至此環境參數宏配置完成ui

修改 Podfile 文件(未使用Pod忽略)

在未添加多Target時,pod只爲一個Target服務,那麼就須要稍微改一下 Podfile文件,讓pod爲每一個Target服務spa

修改前的Podfile文件內容3d

platform :ios, '10.0' source 'https://github.com/CocoaPods/Specs.git' inhibit_all_warnings! target 'XKProject' do pod 'MJRefresh' end

修改後的Podfile文件內容code

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;

相關文章
相關標籤/搜索