2、iOS強化 --- Xcode 多環境的配置

這里我們會介紹三種,在充分了解前兩種的基礎上,建議大家在開發中靈活使用第三種方法。當然,大家在熟練的情況也可以根據實際情況自己組合使用

在講解多環境配置之前我們先來認識一下,我們在Xcode常見的一些名詞,都代表什么意思?

  • Project:包含了項目所有的代碼,資源文件,所有信息。
  • Target:對指定代碼和資源文件的具體構建方式。
  • Scheme:對指定Target的環境配置。
    首先我們來看一個熟悉的東西:
    image.png

    相信大家都會通多上面修改Configuration的方式來切換DebugRelease的開發環境。但是僅僅是這樣并不能滿足我們日常的開發需求,下面我們來介紹三種Xcode的多環境配置,希望可以在日常的開發中給大家帶來方便,增加效率。

方法一:通過增加Target

我們知道,Target是對指定代碼和資源文件的具體構建方式。那么理論上我們知道復制一份Target出來,然后在不同的Target下,設置不同的參數配置不就可以了嗎!
下面我們來配置一下:
1、首先我們針對對應的Target,制作一個副本

image.png

2、制作完成之后,我們會發現工程里面多了一個Target和一個Info.plist文件,同時也會多一個Scheme
image.png

image.png

3、我們可以通過修改Bundle IndentifierInfo.plistScheme名稱來進行區分

image.png

image.png

?? 注意,修改外Info.plist文件名之后,一定要在對應的Build Settings里面修改Info.plist路徑

image.png

  • 我們接著講一下,Target中預定義宏的的設置
    我們再testDebug中設置自定義的
    image.png

    使用如下:
if (TEST_DEBUG) {
        NSLog(@"Debug");
    } else {
        NSLog(@"Release");
    }

注意 ?? :此時TEST_DEBUG我們并不能在test中使用,因為我們只在testDebug設置了;那么當我們切換到test環境中的時候,就會報錯:(這里要注意,對個Target操作的只有一套代碼)

image.png

這時候我們只需要在test環境下也設置同樣名字的就可以了,對應的值設置成不同的,就可以在代碼里面區分不同的環境,執行不同的指令了。

  • Swift環境中設置Other Swift Flags,混編情況下也是一樣。
    我們在上面工程的基礎上看下混編要怎么設置(注意,視情況做出調整):
    這里要注意,在添加一定要在前面加一個-D
    image.png

方法二:添加Scheme

image.png

然后我們可以對不同的Scheme配置不同的configuration來進行環境區分。如下:
image-debug.png

image-release.png

這樣我們就可以通過切換不同的Scheme來切換不同的開發環境。

  • 舉個例子,不同的Scheme對應不同的AppIcon:
    首先我們要在Assets.xcassets再添加一個AppIcon

    image.png

    接著我們可以在targetBuild Settings里面設置不同的configuration對應不同的AppIcon
    image.png

  • 我們還可以針對不同Scheme設置不同的App Name
    TargetBuild Settings里面添加自定義的字段,如下:

    image.png

    假設我們現在就將字段名定義為BUNDLEDISPLAY_NAME,然后Debug模式下就叫DebugRelease模式下就叫Release
    接著我們要在Info.plist文件中替換Bundle name:
    image.png

    效果如下:
    debug.png

release.png

缺點:此時同樣的,我們還是需要在Target里面修改很多東西,這樣的還難免會遺漏一些東西,改起來也不是特別的方便。

方法三:利用xcconfig文件,結合自定義的Scheme來配置多環境開發

  • 首先我們來了解一下什么是xcconfig文件,我們在使用cocopod的時候,會自動什么podxcconfig文件,如下:
    image.png

    其實這個xcconfig文件類似于plist文件,就是一個Key-Value的集合,其對應的就是Target中的設置:
    image.png
  • 既然cocopod可以定義自己的xcconfig文件,那么我們也可以定義自己的xcconfig文件,這樣做的好處是,將需要修改的環境變量集中到一個文件里面,這樣便于管理。
    下面我們自定義自己的xcconfig文件:
    image.png
  • ?? 注意:xcconfig文件的命名規則是:<文件夾名稱-APP名稱.對應的configuration>如下:
    image.png
  • 然后我們在PROJECT-Info-Configurations里面,將不同的configuration設置對應的xcconfig文件:
    image.png
  • xcconfig文件其實就是一個Key-Value文件,對應的就是Target的設置。下面我們來測試一下:
    1、首先我們在TargetBuild Settings里面設置自己的字段:
    image.png

    2、接著我們給工程加一個test1_DebugScheme,對應的就是Debug模式;原來的test1對應Release模式:
    image.png

    3、根據上面講的,將不同的configuration設置對應的xcconfig文件,在xcconfig文件中我們這樣寫:
    Debug文件:APP_CONFIG = APP_Debug_Replace
    Release文件:APP_CONFIG = APP_Release_Replace
    4、我們在Info.plist文件中添加一個剛剛設置的字段:
    image.png

    5、打印我們自定義的字段:
NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"%@",infoDic[@"APP_CONFIG"]);

/*運行test1*/
輸出結果:APP_Release_Replace
/*運行test1_Debug*/
輸出結果:APP_Debug_Replace

講到這里,大家可能會覺得第三種方法中,單獨添加一個test1_Debug完全就是多余,可以通過運行的時候切換test1configuration也能實現上面的效果。
這里請大家考慮一下,實際的開發中,你面對的可能不只是Debug & Release環境,可能有本地測試服正式服等等。因此個人建議,用不同的Scheme區分開,是比較高效的處理方式。

這里給大家推薦一個網站,可以查到Target的各個字段對應的縮寫:Xcode Build Settings

  • 下面我們介紹一下最后一個知識點:xcconfig文件沖突
  • 沖突 1:

實際開發中,我們會使用Cocopods來管理我們的第三方庫,Cocopods也會給我們生成一些xcconfig文件(這里注意?? :每次podCocopods都會從新生成xcconfig文件,所以不要在Cocopods生成的xcconfig文件中做修改)

那么這個時候,就有一個問題,我們針對configuration到底要選哪一個xcconfig文件呢?
答案當然是我們自定義的xcconfig

這樣有衍生出另一問題,那么pod生成的xcconfig我們該怎么處理,如果不添加,則pod install就會出問題,如果是之前pod好的工程,那么pod中針對Target的一些設置又該怎么辦?
其實很簡單,我們只需要在自定義xcconfig文件中引入pod生成的xcconfig文件就可以了,如下:

#include "Pods/Target Support Files/Pods-test1/Pods-test1.debug.xcconfig"
  • 沖突 2:

解決了上面的問題,我們來看另一問題,嚴格將問題2也是一個衍生問題。

如果自定義xcconfigpod生成的xcconfig文件,對同一個字段進行了修改,那Xcode會用哪個文件中的配置呢?
答案是:自定義xcconfig,其實大家想一下就明白了,自定義的 引用 pod生成的,然后Xcode再引用自定義的

那么像這種問題我們該怎么解決呢?
這里我們先給出答案:使用$(inherited),可以理解為繼承。

下面我們看一下具體的使用場景:
首先我們在自定義的xcconfig文件中添加

OTHER_LDFLAGS = -framework "SDWebImage"

同時我們也podAFNetworking
此時我們會發現,在TargetBuild Settings-Other Link Flags路面只有SDWebImage,如下:

image.png

這也就意味著,我們引入的第三方庫的鏈接是失敗的。
這時候,我們就可以在等號加上-framework "SDWebImage"

OTHER_LDFLAGS = $(inherited) -framework "SDWebImage"

這里跟大家分享一下:問題 2 的解決辦法,其實就在pod自己生成的xcconfig里面,如果有興趣可以先不自定義xcconfig,使用pod引入一個三方庫,看看pod自動生成的xcconfig是怎么寫的,然后對應的Target里面的設置又有了哪些變化。

Tips:
大家在配置自己的xcconfig文件的時候有幾個小技巧跟大家講一下:

  • 1、在Build Settings里面自定義了URL字段,在xcconfig如何配置//的問題
    如果我們直接在xcconfig文件中寫上對應的URL會是被識別為注釋符號
    我們可以先定義一個/的變量:
A = /
HOST_URL = ${A}/192.168.1.1

其中${A}$(A) 是等價的。

  • 2、比如說我們現在要配置 OTHER_LDFLAGS,按照上面講的我們是這樣寫的:
OTHER_LDFLAGS =  -framework "SDWebImage"

其實我們還可以添加附加條件,比如:指定特定的開發環境機型架構等等,如下:

OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64] =  -framework "SDWebImage"

此時OTHER_LDFLAGS引入SDWebImage只會在Debug模式下,運行模擬器并且對應的執行架構為x86_64的時候,才會執行。

優先級(由高到低):

  1. 手動配置Target Build Settings
  2. Target中配置的xcconfig文件
  3. 手動配置Project Build Settings
  4. Project中配置的xcconfig文件
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 由于項目中我們可能存在多個環境的配置 如debug 和release 為了更方便的管理我們需要做多環境配置。那么下...
    猿人閱讀 808評論 0 2
  • [toc] 前言 創建一個項目在xcode中有以下三項,在平時開發不是很大型的項目,很少會注意這些問題。 Xcod...
    清風烈酒2157閱讀 1,897評論 1 4
  • Xcode多環境配置一共有3種形式: Target Scheme xcconfig Project:包含了項目所有...
    HotPotCat閱讀 2,308評論 1 3
  • App多環境配置探索 簡介 App開發為什么需要使用多環境呢?原因很簡單,就是為了 App 或 App 新功能 在...
    evanxlh閱讀 341評論 0 0
  • 在Xcode開發中通常會針對Debug/Release使用不同的服務器地址,最簡單的方式那肯定是直接在代碼中進行修...
    崔希羽閱讀 459評論 0 0