UNKO.fun

Blog Post

通过xcconfig生成代码

July 27, 2019 | 3 min

iOS

Post content

目标

通过xcconfig文件生成代码

// config.xcconfig

CUSTOM_VALUE = my_custom_value
struct BuildConfig {
    private init() {}
    static let CUSTOM_VALUE = "my_custom_value"
}

xcconfig文件

Mattt的文章介绍了xcconfig文件在xcode中的用处。

xcconfig文件里的键值对会在编译时放入xcode的编译环境里,这意味着开发者可以在编译时通过env命令拿到xcconfig里的内容。

// config.xcconfig

CUSTOM_VALUE = my_custom_value

编译时会运行如下内容:

...
export CURRENT_ARCH=undefined_arch
export CURRENT_VARIANT=normal

export CUSTOM_VALUE=my_custom_value

export DEAD_CODE_STRIPPING=YES
export DEBUGGING_SYMBOLS=YES
...

但是可以看出xcconfig里的内容和xcode自带的env属性并不能区分,所以需要把Key加上前缀。

生成代码

这篇文章介绍了如何通过xcconfig生成代码。

前面说到要在编译时通过env命令可以拿到xcconfig的内容,但是生成的代码文件又要在编译时被编译,所以要在Xcode里Build PhaseCompile Source脚本前运行脚本生成代码。

这里的使用的前缀是BuildConfig_,shell脚本如下

printf "//\n//\n//generated by BuildConfig.sh\n"

printf "\nimport Foundation\n\n"

echo "struct BuildConfig { "

echo "\tprivate init() {}"

env |\

grep "BuildConfig_" | \

sed "s/BuildConfig_/    static let /" |\

sed -E 's/=(.*)/ = "\1"/'

echo "}"

然后在Xcode的Build Phase的脚本里运行上述脚本。

"${PROJECT_DIR}/Your Shell Path" > "${PROJECT_DIR}/generated swift file path"

Demo

地址: https://github.com/AmyF/XCConfigDemo