基本用法

XCConfig 是一种外部化的 Xcode 构建设置。

你可以用如下格式列出构建设置:

BUILD_SETTING_NAME = value

也可以使用带条件的值:

ONLY_ACTIVE_ARCH[config=Debug][sdk=*][arch=*] = YES

在 Swift 中可以这样访问该值:

let object = Bundle.main.object(forInfoDictionaryKey:key)

分离配置与代码

应用有时会将配置以常量的形式存储在代码中。这违反了 Twelve-Factor 的原则,它要求配置与代码严格分离。配置在不同部署之间差异很大,而代码则不会。

不好的写法

下面的代码把常量值写在了代码里。

import Foundation
 
#if DEBUG
let apiBaseURL = URL(string: "https://api.staging.example.com")!
#else
let apiBaseURL = URL(string: "https://api.example.com")!
#endif

当你需要针对不同环境使用不同的值时,这是一种常见写法。这是用编码实现的配置。 在这个例子里,apiBaseURL 只是一个值,但代码却比它应有的样子更复杂。 引入 XCConfig 后,上面这整段代码就不用写了。

好的写法

假设你有两个 XCConfig 文件:Debug.xcconfig 和 Release.xcconfig。

API_BASE_URL = api.staging.example.com
API_BASE_URL = api.example.com

在 Swift 中,只需获取并使用这个值:

guard let url = Bundle.main.object(forInfoDictionaryKey:"API_BASE_URL") else {
    return
}
 
URLSession...

代码在任何环境下都保持一致,而值会随环境变化。

重要提示

XCConfig 和头文件一样是公开文件,在二进制包中是可见的。绝对不要在里面存放凭证或机密信息。

管理机密值

一般性建议:不要用 xcconfig 文件来存储 API Key 或其他凭证之类的机密信息。

尽管如此,如果你确实需要在 XCConfig 中管理机密值,也是可行的——只要不把 XCConfig 文件签入 VCS(git、subversion 等)。

在 .gitignore 中(如果你在用 git):

path/to/Release.xcconfig
path/to/Debug.xcconfig

你仍然可以通过 Bundle API 访问这些值。它的工作方式类似 .env

参考资料