Xcode - Setting/Adding 来自 bash 脚本的环境变量在构建阶段

Xcode - Setting/Adding environment variables from a bash script during the build phase

我有 2 个 API 当前在我的代码中使用的键,并且也在代码中进行了硬编码。这些密钥需要从代码中完全删除,并在构建阶段作为环境变量而不是从外部 Xcode 添加。到目前为止,我已经尝试过这个脚本

export API_KEY=keyvalue

作为一个 运行 脚本出现在构建阶段的编译源之前,将该脚本作为项目方案中的 Pre Action,并且还使用此但环境变量从命令行构建应用程序因为给定的键总是空的。

xcodebuild -project MyProject.xcodeproj \
-scheme "My Scheme" \
-sdk iphoneos \
-destination 'platform=iOS,name=<devicename>' \
-derivedDataPath './output' \
API_KEY='KEY' \
SECOND_API_KEY='KEY' \

像这样手动构建项目时,我可以看到像所有其他设置一样正确导出密钥,但似乎无法使用 NSProcessInfo.processInfo.environment objectForKey:@"API_KEY" 或 NSUserDefaults 访问它们。我也尝试过编辑 Xcode 中的方案,以便将环境变量设置为 API_KEY = $(API_KEY) 以及上面的内容,但这没有用,以及设置默认值Build Settings 中这些键的值也不起作用。这真的可以做到吗?谢谢。

如果我对你的理解是正确的,那你就是误解了环境变量,如果不是我很抱歉。

当您的应用程序 运行 时,您无法访问在构建过程中设置的环境变量 – 除非该构建过程将值写入代码或某些配置文件。

环境变量在启动时传递给进程,您的代码可以访问这些变量。虽然环境变量的 names 需要嵌入到您的代码中,但这些变量的 values 不需要。

听起来您希望在没有 运行 所需的 API 密钥的情况下分发已编译的应用程序,然后在 运行 时提供这些密钥。您可以通过使用一个小的 shell 脚本来设置环境变量然后启动您的应用程序来完成此操作。或者您可以使用类似于用于序列号的方案,因此当您的应用首次启动时,您的用户必须输入 API 键(只需告诉他们它们是序列号 ;-)),然后将它们存储在以您选择的任何方式混淆的合适文件(例如,在您的应用程序的首选项或应用程序支持文件夹中)。 HTH