通過文件的形式渊跋,管理、替代Build Settings,更方便的管理設(shè)置Build Settings侨舆。其以Key-Value格式(Build Settings類似shell環(huán)境變量),進行編輯绢陌。參考官方文檔
創(chuàng)建 -- 后綴名xcconfig
- 項目中挨下,command + N 搜索config;
- 選擇Configuration Settings File脐湾;
- Next -- 命名文件名稱臭笆;
- Create -- 創(chuàng)建完成;
- 配置關(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è)置
語法
注釋 -- “//” 兩正斜杠
- 單行注釋腋舌,注釋整行;
- 也可以在設(shè)置值后面渗蟹;
- 與URL中“//”互斥問題块饺。
圖2中:URL與 // 問題解決:如自定義一個正斜杠變量TAG_SLASH赞辩,在URL引用TAG_SLASH變量
“//”實現(xiàn)使用
變量 -- 以Key=Value的形式
Key一般以大寫字母下劃線分割;可以自定義授艰,也可以使用Xcode已定義好的環(huán)境變量辨嗽。
-
覆蓋變量:變量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
-
引?變量:
$()
和${}
兩種寫法都可以:
- 條件變量:對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)
-
Value類型 常見的有如下:
- Boolean:YES or NO炮沐;
- string:字符串,指定的文本值回怜;
- enumeration (string):枚舉大年,預(yù)定義的文本值;
- string list:字符串列表玉雾,以空格分隔的字符串值列表翔试。如果字符串列表中的字符串包含空格,則字符串必須用引號括起來复旬;
- path:路徑垦缅,POSIX格式的文件或目錄路徑;
- path list:路徑列表驹碍,用空格分隔的路徑值列表壁涎。如果路徑列表中的路徑包含空格,則路徑必須用引號括起來志秃。
"怔球、'單雙引號表示字符串
雙引號、單引號表示字符串
執(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)前生成配置文件位于同一文件夾中的生成配置文件的名稱;
-
相對路徑
- 相對于當(dāng)前生成配置文件的位置件相,生成配置文件的路徑再扭;或以
${SRCROOT}
的路徑開始;
# include“. . / MyOtherConfigFile.xcconfig”
:當(dāng)前文件上一層
# include“ ${SRCROOT} /Test/MyOtherConfigFile.xcconfig”
:當(dāng)前項目根目錄下的Test文件夾里
- 相對于當(dāng)前生成配置文件的位置件相,生成配置文件的路徑再扭;或以
-
絕對路徑
- 生成配置文件在磁盤上的絕對路徑夜矗。
#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等
- xcconfig文件自定義變量从媚;
- Info.plist文件設(shè)置自定義Key,獲取變量患整;
- 代碼使用拜效,用Info.plist獲取。
擴展
腳本功能模塊保存在項目.xcodeproj(顯示包內(nèi)容)~> project.pbxproj各谚。所以可以使用腳本注入一些信息紧憾,想達到的操作。