xcode内置了一个shell环境,编译的时候Build Setting中的配置会被Xcode导成环境变量并执行相应的命令。

如图我们在项目中添加一个 ' Test' 脚本命令,然后编译项目,会发现xcode提示错误,并列出一个表

表中 = 左边的代表key,右边的代表值,我们选出其中的一个key:ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES,在Biuld Settings中搜索会看到搜索结果。

这些key和值就表示了xcode的编译配置,这也代表我们可以在Biuld Settings外部通过这写key和值改变xcode的配置。

在oc与swift混编项目swift如果想要引用oc代码中需要导入桥接头文件并置顶文件路径。

在终端通过xcodebuild -showBuildSettings命令输出项目中的xcconfig配置,能够看到
SWIFT_OBJC_BRIDGING_HEADER 对应的值就是 桥接文件的路径。那么我们能否不通过BuildSettings而通过xcconfig配置桥接文件呢。

首先将原来配置的路径删除,注意清空路径后还要选中当前行再按下删除键,因为xcode默认BuildSettings优先级最高,否则xcode会认为配置的是空路径


新建一个config文件,并添加相关配置


选择生效模式。然后编译项目。在Build Setting中发现路径会自动添加到对应的模式下。

条件变量
引用变量:{}
根据SDK,Archive,Configration对设置进行条件化,如:
指定Configration是Debug还是Release
指定SDK是模拟器,还是iPhoneos,macosx等
指定架构是arm64还是x86_64
[config=Debug][sdk=iphonesimulator*][arch=x86_64]
Xcode 11.4及以后版本可以指定变量为空时的默认值
//$(BUILD_SETTING_NAME:default=value)
应用
hosturl:开发工作中,为了方便开发与测试,往往不同的环境需要配置不同的域名。
因为plist文件是会被编译到ipa包里的,所以我们可以把host_url加到plist文件中,然后通过plist文件获取host_url
Xcode在编译的时候会在shell环境中把变量自动替换成这个变量所代表的值

可以看到控制台成功打印了我们在config中设置的host_url
宏
为什么我们在工程里什么都没有写就可以使用DEBUG这个宏呢,就是因为xcode在bulid setting里预先给我们定义了

鼠标放上去会提示我们它的key以及key所等于的值
GCC_PREPROCESSOR_DEFINITIONS[config=Debug][sdk=*][arch=*] = DTest=1
GCC_PREPROCESSOR_DEFINITIONS[config=Release][sdk=*][arch=*] = RTest=1
我们仿照xcode在 Debug模式下设置DTest=1,Release模式下设置RTest=1。

编译之后就会看到我们设置的宏已经配置到build setting里了,这样我们就可以通过自己的宏来判断当前的编译模式了
#if DTest
#import "DTestView.h"
#endif
#if RTest
#import "RTestView.h"
#endif
@interface ViewController ()
{
DTestView *_dView;
RTestView *_rView;
}
@end
如在通过判断环境模式来中导入头文件。
扩展


在build setting里找到 User-Defind 然后添加一个key definedTest = hello xcconfig
再放到info plist文件

最后在到项目中获取读取info plist 看到控制台成功打印的这个值。
也就是说我们还可以通过User-Defind自定义build setting中的配置。