xcconfig 基本使用与分析

通过文件的形式,管理、替代Build Settings,更方便的管理设置Build Settings。其以Key-Value格式(Build Settings类似shell环境变量),进行编辑。参考官方文档

创建 -- 后缀名xcconfig
  1. 项目中,command + N 搜索config;
  2. 选择Configuration Settings File;
  3. Next -- 命名文件名称;
  4. Create -- 创建完成;
  5. 配置关联xcconfig文件,使xcconfig生效。

一个项目中允许有多个xcconfig文件,但只有一个入口,只能配置一个xcconfig文件,其它xcconfig文件被#include到入口文件即可。
可以给Project、Target配置;如图中步骤4,展开Project,就显示Target,就可以给Target添加配置。

配置关联xcconfig文件(入口),图中为Debug环境下给Project设置

语法
注释 -- “//” 两正斜杠
  1. 单行注释,注释整行;
  2. 也可以在设置值后面;
  3. 与URL中“//”互斥问题。

图2中:URL与 // 问题解决:如自定义一个正斜杠变量TAG_SLASH,在URL引用TAG_SLASH变量

“//”实现使用


变量 -- 以Key=Value的形式

Key一般以大写字母下划线分割;可以自定义,也可以使用Xcode已定义好的环境变量。

  1. 覆盖变量:变量Key与Xcode一致时。会出现覆盖,如高优先级覆盖低优先级、先执行被后执行覆盖。可以通过${inherited},让当前变量值继承原有值。例如:
OTHER_LDFLAGS = -framework Masonry 
OTHER_LDFLAGS = $(inherited) -framework AFNetworking
// OTHER_LDFLAGS = -framework Masonry -framework AFNetworking

注意:有部分变量不能通过 xcconfig 配置到 Build Settings 中,例如:配置PRODUCT_BUNDLE_IDENTIFIER 不起作⽤。

获取Xcode定义好的环境变量Key

  1. 引⽤变量: $()${} 两种写法都可以:
  1. 条件变量:对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)

  1. Value类型 常见的有如下:

    • Boolean:YES or NO;
    • string:字符串,指定的文本值;
    • enumeration (string):枚举,预定义的文本值;
    • string list:字符串列表,以空格分隔的字符串值列表。如果字符串列表中的字符串包含空格,则字符串必须用引号括起来;
    • path:路径,POSIX格式的文件或目录路径;
    • path list:路径列表,用空格分隔的路径值列表。如果路径列表中的路径包含空格,则路径必须用引号括起来。
  2. "、'单双引号表示字符串

双引号、单引号表示字符串

执行脚本
  • Xcode执行脚本的配置
脚本的配置;执行Shell语言的echo命令输出设置的xcconfig值
在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
链接.a库 三步骤

配置完成头文件

配置Build Settings优先级

Target > Target-xcconfig > Project > Project-xcconfig。BuildSettings默认继承 ${inherited}

  • Target 配置Build Settings
  • Target 配置xcconfig文件
  • Project 配置Build Settings
  • Project 配置xcconfig文件
Target中删除HEADER_SEARCH_PATHS,xcconfig设置失效;或者导入其它库会覆盖xcconfig的值

  • 如果Project和Target都添加了同一个xcconfig文件,此时xcconfig文件属于Target的xcconfig
  • 需要使用关键字${inherited}

关键字继承 -- ${inherited}、包含/导入 -- #include

继承 -- ${inherited}
在不同文件中,存在优先级关系时,同一个key时高优先级会覆盖掉低优先级的value。一般开发中,设置的value是一起存在。所以就需要使用 ${inherited},解决该种问题。存在优先级关系有:

  • 配置Build Settings优先级
  • 多个xcconfig中(例如:a文件引入b文件,此时a的文件比b文件高,其实以内容的执行顺序有关,会直接覆盖之前的内容)
在Target中添加${inherited},就把xcconfig同一Key值继承过来

包含/导入 -- #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等

  1. xcconfig文件自定义变量;
  2. Info.plist文件设置自定义Key,获取变量;
  3. 代码使用,用Info.plist获取。



扩展
脚本功能模块保存在项目.xcodeproj(显示包内容)~> project.pbxproj。所以可以使用脚本注入一些信息,想达到的操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容