xcconfig 基本使用與分析

通過文件的形式渊跋,管理、替代Build Settings,更方便的管理設(shè)置Build Settings侨舆。其以Key-Value格式(Build Settings類似shell環(huán)境變量),進行編輯绢陌。參考官方文檔

創(chuàng)建 -- 后綴名xcconfig
  1. 項目中挨下,command + N 搜索config;
  2. 選擇Configuration Settings File脐湾;
  3. Next -- 命名文件名稱臭笆;
  4. Create -- 創(chuàng)建完成;
  5. 配置關(guān)聯(lián)xcconfig文件秤掌,使xcconfig生效愁铺。

一個項目中允許有多個xcconfig文件,但只有一個入口闻鉴,只能配置一個xcconfig文件帜讲,其它xcconfig文件被#include到入口文件即可。
可以給Project椒拗、Target配置似将;如圖中步驟4,展開Project蚀苛,就顯示Target在验,就可以給Target添加配置。

配置關(guān)聯(lián)xcconfig文件(入口)堵未,圖中為Debug環(huán)境下給Project設(shè)置

語法
注釋 -- “//” 兩正斜杠
  1. 單行注釋腋舌,注釋整行;
  2. 也可以在設(shè)置值后面渗蟹;
  3. 與URL中“//”互斥問題块饺。

圖2中:URL與 // 問題解決:如自定義一個正斜杠變量TAG_SLASH赞辩,在URL引用TAG_SLASH變量

“//”實現(xiàn)使用


變量 -- 以Key=Value的形式

Key一般以大寫字母下劃線分割;可以自定義授艰,也可以使用Xcode已定義好的環(huán)境變量辨嗽。

  1. 覆蓋變量:變量Key與Xcode一致時。會出現(xiàn)覆蓋淮腾,如高優(yōu)先級覆蓋低優(yōu)先級糟需、先執(zhí)行被后執(zhí)行覆蓋」瘸可以通過${inherited}洲押,讓當(dāng)前變量值繼承原有值。例如:
OTHER_LDFLAGS = -framework Masonry 
OTHER_LDFLAGS = $(inherited) -framework AFNetworking
// OTHER_LDFLAGS = -framework Masonry -framework AFNetworking

注意:有部分變量不能通過 xcconfig 配置到 Build Settings 中圆凰,例如:配置PRODUCT_BUNDLE_IDENTIFIER 不起作?杈帐。

獲取Xcode定義好的環(huán)境變量Key

  1. 引?變量: $()${} 兩種寫法都可以:
  1. 條件變量:對SDK 、 Arch 和 Configration 對設(shè)置進?條件化
1 //指定`Configration`是`Debug`
2 // 指定`SDK`是模擬器专钉,還有iphoneos*挑童、macosx*等 
3 // 指定?效架構(gòu)為`x86_64`
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64]=
$(inherited) -l AFNetworking

注意:在 Xcode 11.4 及以后版本,可以使? default 驶沼,來指定變量為空時的默認值:
$(BUILD_SETTING_NAME:default=value)

  1. Value類型 常見的有如下:

    • Boolean:YES or NO炮沐;
    • string:字符串,指定的文本值回怜;
    • enumeration (string):枚舉大年,預(yù)定義的文本值;
    • string list:字符串列表玉雾,以空格分隔的字符串值列表翔试。如果字符串列表中的字符串包含空格,則字符串必須用引號括起來复旬;
    • path:路徑垦缅,POSIX格式的文件或目錄路徑;
    • path list:路徑列表驹碍,用空格分隔的路徑值列表壁涎。如果路徑列表中的路徑包含空格,則路徑必須用引號括起來志秃。
  2. "怔球、'單雙引號表示字符串

雙引號、單引號表示字符串

執(zhí)行腳本
  • Xcode執(zhí)行腳本的配置
腳本的配置浮还;執(zhí)行Shell語言的echo命令輸出設(shè)置的xcconfig值
在Xcode的終端輸出執(zhí)行結(jié)果

由于查看腳本結(jié)果每次到Xcode終端查看編譯記錄竟坛,Xcode終端和Mac上的終端都是Shell環(huán)境,所以把執(zhí)行的腳本結(jié)果重定位到Mac終端上。

  • 重定位
    把Xcode執(zhí)行Shell語言的結(jié)果在Mac終端上輸出
    • “1”:獲取當(dāng)前執(zhí)行shell命令的標(biāo)準輸出(無語法錯誤的輸出)担汤;
    • “>”:重定位符涎跨;
    • 獲取終端標(biāo)識符:輸入“tty”
獲取當(dāng)前終端的標(biāo)識符
第五行的執(zhí)行結(jié)果重定位到終端上
在終端輸出結(jié)果

鏈接 .a庫
  • 配置頭文件 -- 編譯.o文件生效
    HEADER_SEARCH_PATHS = ${SRCROOT}/MyXconfig/Libs
  • 庫所在目錄 -- 符號信息
    LIBRARY_SEARCH_PATHS = ${SRCROOT}/MyXconfig/Libs
  • 鏈接器連接庫 -- 鏈接器生成可執(zhí)行文件(需要符號的具體信息,在.a的庫里 )崭歧;“-l”參數(shù):表示庫library;多個庫用空格隅很。
    OTHER_LDFLAGS = -lAFNetworking -lMasonry
鏈接.a庫 三步驟

配置完成頭文件

配置Build Settings優(yōu)先級

Target > Target-xcconfig > Project > Project-xcconfig。BuildSettings默認繼承 ${inherited}

  • Target 配置Build Settings
  • Target 配置xcconfig文件
  • Project 配置Build Settings
  • Project 配置xcconfig文件
Target中刪除HEADER_SEARCH_PATHS驾荣,xcconfig設(shè)置失效外构;或者導(dǎo)入其它庫會覆蓋xcconfig的值

  • 如果Project和Target都添加了同一個xcconfig文件普泡,此時xcconfig文件屬于Target的xcconfig
  • 需要使用關(guān)鍵字${inherited}

關(guān)鍵字繼承 -- ${inherited}播掷、包含/導(dǎo)入 -- #include

繼承 -- ${inherited}
在不同文件中,存在優(yōu)先級關(guān)系時撼班,同一個key時高優(yōu)先級會覆蓋掉低優(yōu)先級的value歧匈。一般開發(fā)中,設(shè)置的value是一起存在砰嘁。所以就需要使用 ${inherited}件炉,解決該種問題。存在優(yōu)先級關(guān)系有:

  • 配置Build Settings優(yōu)先級
  • 多個xcconfig中(例如:a文件引入b文件矮湘,此時a的文件比b文件高斟冕,其實以內(nèi)容的執(zhí)行順序有關(guān),會直接覆蓋之前的內(nèi)容)
在Target中添加${inherited}缅阳,就把xcconfig同一Key值繼承過來

包含/導(dǎo)入 -- #include
配置多個xcconfig文件磕蛇,但引入xcconfig的入口只有一個,所以此時需要使用上關(guān)鍵字#include十办。[注意]:多個xcconfig文件秀撇,同一個key會產(chǎn)生覆蓋,就需要使用“${inherited}”繼承向族。引用三種方式呵燕,如下:

  • 文件名
    • 與當(dāng)前生成配置文件位于同一文件夾中的生成配置文件的名稱;
      # include“MyOtherConfigFile.xcconfig”
  • 相對路徑
    • 相對于當(dāng)前生成配置文件的位置件相,生成配置文件的路徑再扭;或以${SRCROOT}的路徑開始;
      # include“. . / MyOtherConfigFile.xcconfig” :當(dāng)前文件上一層
      # include“ ${SRCROOT} /Test/MyOtherConfigFile.xcconfig”:當(dāng)前項目根目錄下的Test文件夾里
  • 絕對路徑
    • 生成配置文件在磁盤上的絕對路徑夜矗。
      #include "/Users/MyUserName/Desktop/MyOtherConfigFile.xcconfig"

[注意]:如果在生成時沒有找到指定的文件泛范,則會生成生成警告。要消除對丟失構(gòu)建配置文件的警告侯养,請在#include前綴后加上問號(?)敦跌。

#include? "MyOtherConfigFile.xcconfig"

  • Cocoapods
    項目中使用cocoapods管理,其就有用xcconfig配置Build Settings。而自己添加xcconfig文件時柠傍。就把引入xcconfig文件入口選擇自己的xcconfig麸俘,并在里面#include cocoapods的xcconfig文件路徑。



項目里訪問xcconfig值

目前只能用Info.plist** 打開Info.plist可以訪問Build Settings里的變量值惧笛。如:Bundle name/identifier等

  1. xcconfig文件自定義變量从媚;
  2. Info.plist文件設(shè)置自定義Key,獲取變量患整;
  3. 代碼使用拜效,用Info.plist獲取。



擴展
腳本功能模塊保存在項目.xcodeproj(顯示包內(nèi)容)~> project.pbxproj各谚。所以可以使用腳本注入一些信息紧憾,想達到的操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昌渤,一起剝皮案震驚了整個濱河市赴穗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膀息,老刑警劉巖般眉,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潜支,居然都是意外死亡甸赃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門冗酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埠对,“玉大人,你說我怎么就攤上這事已烤○埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵胯究,是天一觀的道長稍计。 經(jīng)常有香客問我,道長裕循,這世上最難降的妖魔是什么臣嚣? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮剥哑,結(jié)果婚禮上硅则,老公的妹妹穿的比我還像新娘。我一直安慰自己株婴,他們只是感情好怎虫,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布暑认。 她就那樣靜靜地躺著,像睡著了一般大审。 火紅的嫁衣襯著肌膚如雪蘸际。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天徒扶,我揣著相機與錄音粮彤,去河邊找鬼。 笑死姜骡,一個胖子當(dāng)著我的面吹牛导坟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圈澈,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惫周,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了士败?” 一聲冷哼從身側(cè)響起闯两,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤褥伴,失蹤者是張志新(化名)和其女友劉穎谅将,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體重慢,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡饥臂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了似踱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隅熙。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖核芽,靈堂內(nèi)的尸體忽然破棺而出囚戚,到底是詐尸還是另有隱情,我是刑警寧澤轧简,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布驰坊,位于F島的核電站,受9級特大地震影響哮独,放射性物質(zhì)發(fā)生泄漏拳芙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一皮璧、第九天 我趴在偏房一處隱蔽的房頂上張望舟扎。 院中可真熱鬧,春花似錦悴务、人聲如沸睹限。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羡疗。三九已至删窒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顺囊,已是汗流浹背肌索。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留特碳,地道東北人诚亚。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像午乓,于是被迫代替她去往敵國和親站宗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容