编译iOS

xcconfig 基本使用与分析

2022-03-03  本文已影响0人  寸光片静

通过文件的形式,管理、替代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. "、'单双引号表示字符串

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

执行脚本
脚本的配置;执行Shell语言的echo命令输出设置的xcconfig值 在Xcode的终端输出执行结果

由于查看脚本结果每次到Xcode终端查看编译记录,Xcode终端和Mac上的终端都是Shell环境,所以把执行的脚本结果重定位到Mac终端上。

获取当前终端的标识符 第五行的执行结果重定位到终端上 在终端输出结果

链接 .a库
链接.a库 三步骤
配置完成头文件

配置Build Settings优先级

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

Target中删除HEADER_SEARCH_PATHS,xcconfig设置失效;或者导入其它库会覆盖xcconfig的值
  • 如果Project和Target都添加了同一个xcconfig文件,此时xcconfig文件属于Target的xcconfig
  • 需要使用关键字${inherited}

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

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

在Target中添加${inherited},就把xcconfig同一Key值继承过来

包含/导入 -- #include
配置多个xcconfig文件,但引入xcconfig的入口只有一个,所以此时需要使用上关键字#include。[注意]:多个xcconfig文件,同一个key会产生覆盖,就需要使用“${inherited}”继承。引用三种方式,如下:

[注意]:如果在生成时没有找到指定的文件,则会生成生成警告。要消除对丢失构建配置文件的警告,请在#include前缀后加上问号(?)。

#include? "MyOtherConfigFile.xcconfig"




项目里访问xcconfig值

目前只能用Info.plist** 打开Info.plist可以访问Build Settings里的变量值。如:Bundle name/identifier等

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



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

上一篇 下一篇

猜你喜欢

热点阅读