通过文件的形式,管理、替代Build Settings,更方便的管理设置Build Settings。其以Key-Value格式(Build Settings类似shell环境变量),进行编辑。参考官方文档
创建 -- 后缀名xcconfig
- 项目中,command + N 搜索config;
- 选择Configuration Settings File;
- Next -- 命名文件名称;
- Create -- 创建完成;
- 配置关联xcconfig文件,使xcconfig生效。
一个项目中允许有多个xcconfig文件,但只有一个入口,只能配置一个xcconfig文件,其它xcconfig文件被
#include
到入口文件即可。
可以给Project、Target配置;如图中步骤4,展开Project,就显示Target,就可以给Target添加配置。
语法
注释 -- “//” 两正斜杠
- 单行注释,注释整行;
- 也可以在设置值后面;
- 与URL中“//”互斥问题。
图2中:URL与 // 问题解决:如自定义一个正斜杠变量TAG_SLASH,在URL引用TAG_SLASH变量
变量 -- 以Key=Value的形式
Key一般以大写字母下划线分割;可以自定义,也可以使用Xcode已定义好的环境变量。
-
覆盖变量:变量Key与Xcode一致时。会出现覆盖,如高优先级覆盖低优先级、先执行被后执行覆盖。可以通过
${inherited}
,让当前变量值继承原有值。例如:
OTHER_LDFLAGS = -framework Masonry
OTHER_LDFLAGS = $(inherited) -framework AFNetworking
// OTHER_LDFLAGS = -framework Masonry -framework AFNetworking
注意
:有部分变量不能通过 xcconfig 配置到 Build Settings 中,例如:配置PRODUCT_BUNDLE_IDENTIFIER 不起作⽤。
-
引⽤变量:
$()
和${}
两种写法都可以:
- 条件变量:对SDK 、 Arch 和 Configration 对设置进⾏条件化
1 //指定`Configration`是`Debug`
2 // 指定`SDK`是模拟器,还有iphoneos*、macosx*等
3 // 指定⽣效架构为`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):枚举,预定义的文本值;
- string list:字符串列表,以空格分隔的字符串值列表。如果字符串列表中的字符串包含空格,则字符串必须用引号括起来;
- path:路径,POSIX格式的文件或目录路径;
- path list:路径列表,用空格分隔的路径值列表。如果路径列表中的路径包含空格,则路径必须用引号括起来。
"、'单双引号表示字符串
执行脚本
- Xcode执行脚本的配置
由于查看脚本结果每次到Xcode终端查看编译记录,Xcode终端和Mac上的终端都是Shell环境,所以把执行的脚本结果重定位到Mac终端上。
-
重定位
把Xcode执行Shell语言的结果在Mac终端上输出- “1”:获取当前执行shell命令的标准输出(无语法错误的输出);
- “>”:重定位符;
- 获取终端标识符:输入“tty”
链接 .a库
-
配置头文件 -- 编译.o文件生效
HEADER_SEARCH_PATHS = ${SRCROOT}/MyXconfig/Libs
-
库所在目录 -- 符号信息
LIBRARY_SEARCH_PATHS = ${SRCROOT}/MyXconfig/Libs
-
链接器连接库 -- 链接器生成可执行文件(需要符号的具体信息,在.a的库里 );“-l”参数:表示库library;多个库用空格。
OTHER_LDFLAGS = -lAFNetworking -lMasonry
配置Build Settings优先级
Target > Target-xcconfig > Project > Project-xcconfig。BuildSettings默认继承 ${inherited}
- Target 配置Build Settings
- Target 配置xcconfig文件
- Project 配置Build Settings
- Project 配置xcconfig文件
- 如果Project和Target都添加了同一个xcconfig文件,此时xcconfig文件属于Target的xcconfig
- 需要使用关键字
${inherited}
关键字继承 -- ${inherited}、包含/导入 -- #include
继承 -- ${inherited}
在不同文件中,存在优先级关系时,同一个key时高优先级会覆盖掉低优先级的value。一般开发中,设置的value是一起存在。所以就需要使用 ${inherited},解决该种问题。存在优先级关系有:
- 配置Build Settings优先级
- 多个xcconfig中(例如:a文件引入b文件,此时a的文件比b文件高,其实以内容的执行顺序有关,会直接覆盖之前的内容)
包含/导入 -- #include
配置多个xcconfig文件,但引入xcconfig的入口只有一个,所以此时需要使用上关键字#include。[注意]:多个xcconfig文件,同一个key会产生覆盖,就需要使用“${inherited}”继承。引用三种方式,如下:
-
文件名
- 与当前生成配置文件位于同一文件夹中的生成配置文件的名称;
# include“MyOtherConfigFile.xcconfig”
- 与当前生成配置文件位于同一文件夹中的生成配置文件的名称;
-
相对路径
- 相对于当前生成配置文件的位置,生成配置文件的路径;或以
${SRCROOT}
的路径开始;
# include“. . / MyOtherConfigFile.xcconfig”
:当前文件上一层
# include“ ${SRCROOT} /Test/MyOtherConfigFile.xcconfig”
:当前项目根目录下的Test文件夹里
- 相对于当前生成配置文件的位置,生成配置文件的路径;或以
-
绝对路径
- 生成配置文件在磁盘上的绝对路径。
#include "/Users/MyUserName/Desktop/MyOtherConfigFile.xcconfig"
- 生成配置文件在磁盘上的绝对路径。
[注意]:如果在生成时没有找到指定的文件,则会生成生成警告。要消除对丢失构建配置文件的警告,请在#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文件设置自定义Key,获取变量;
- 代码使用,用Info.plist获取。
扩展
脚本功能模块保存在项目.xcodeproj(显示包内容)~> project.pbxproj。所以可以使用脚本注入一些信息,想达到的操作。