基本用法
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。