Xcode-多条件编译xcconfig文件配置

3,399 阅读2分钟

这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

什么是 xcconfig 文件

简单来说,xcconfig 是苹果在 xcode 文件中用来使同一套代码能够在不同的条件下编译,运行的一个配置文件。

怎么生成和配置一个配置文件

在工程中添加一个新文件,然后在弹出框搜索 configuration,就可以看到下图的结果:

截屏2022-01-26 下午3.29.57.png

我这里创建了一个名为 TestConfig.debug.xcconfig 的文件

截屏2022-01-26 下午3.37.12.png

然后在Project里面设置刚才新建的文件,这样就可以在 Debug 条件下使用这个文件了

截屏2022-01-26 下午3.39.00.png

现在就可以开始在 TestConfig.debug.xcconfig 文件中添加配置了。

xcconfig文件语法介绍

xcconfig文件的语法比较简单,每个配置文件都由一系列的键值组成

BUILD_SETTING_NAME = value

注释

xcconfig 文件只有一种注释方式 \\

include 导入其他设置

在创建 xcconfig 文件的时候,可以根据需求,创建多个。这个时候就可以通过 include 关键字导入其他的 xcconfig 内的配置

#include "Debug.xcconfig"

在引入文件的时候,可以写绝对路径也可以使用相对路径。${SRCROOT} 代表项目根目录下,$(PROJECT_DIR)代表的是整个项目。

变量

变量定义,按照OC命名,仅由大写字母、数字和下划线构成,原则上大写,但是也可以小写。字符串可以是双引号"修饰,也可以是单引号'修饰,变量有三种特殊情况:

  1. xcconfig定义的变量与Build Setting中的变量相同,那么就会发生覆盖的情况,可以通过$(inherited)关键字来继承Build Setting的值,这个最常见的就是解决了和 pods.xcconfig 的冲突。
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"

有部分变量不能通过xcconfig 配置到Build Settings,比如配置 PRODUCT_BUNDLE_IDENTIFIER不生效

  1. 引用变量 {}和()都可以

  2. 条件变量,根据SDK、Arch和Configration 对设置进行条件化,比如:

 //指定`Configration`是`Debug`
 //指定`SDK`是模拟器,还是`iphoneos* `macosx*`等等
 //指定生效架构是`x86_64`
 OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*[arch=x86_64]= $(inherited) -framework "SDWebImage"

Xcode 11.4 及之后版本,可以使用default,来指定变量为空时的默认值

$(BUILD_SETTING_NAME:default=value)

优先级(由高到低)

  • 手动配置 Target Build Settings

  • Target 中配置的 xcconfig 文件

  • 手动配置 Project Build Settings

  • Project 中配置的 xcconfig 文件

Xcode Build Settings 对应的 xcconfig 变量,可以查看这个链接:xcodebuildsettings.com

总结:

其实我们在日常开发中,需要设置 Build Settings 选项还是挺多的,假如都设置在 xcconfig 文件中,这样就可以一目了然,并且设置的是条件变量。像我们配置的多环境就可以通过这样的方式实现:具体实现的案例可以参考:iOS配置多环境的三种方案