【问题标题】:Xcode: how to compile environment variables and refer to them in Swift?Xcode:如何编译环境变量并在 Swift 中引用它们?
【发布时间】:2020-03-02 04:44:30
【问题描述】:

我在 CI/CD 平台上定义了一个 API 密钥,如下所示:

export API_KEY="XXXXXXXXXX"

有没有一种方法可以以某种方式在我的构建中编译这个变量,以便我可以在 Swift 中引用它,而不必担心在运行时在二进制环境中定义的变量?我显然不能使用ProcessInfo.processInfo.environment,因为API 密钥只在我的CI/CD 环境中定义。我想用密钥编译我的二进制文件,以便在分发我的应用程序时可以使用密钥。

我的用例是我想避免将 API 密钥放入我的 git 存储库,而是在生成构建时从 CI/CD 平台获取它。如果有办法注入一个环境变量,然后编译为二进制文件的一部分,那将是理想的。

【问题讨论】:

  • 并非如此。无论哪种方式,您的应用都必须拥有它(以便能够将其传输到 API)
  • @Alexander 你可能误解了我的要求。我知道我的应用程序必须以某种方式拥有 API 密钥;我不是想避免这种情况。我只想在构建应用程序时从环境变量中获取它,并在可能的情况下将其与应用程序一起编译。
  • 关于您的 CI 平台的 IDK,但在最坏的情况下,您可以编写一个脚本来读取 CI 环境变量,并将其存储到您的应用程序可以访问的位置。但是“不必担心在运行时在二进制环境中定义的变量”是不可能的。
  • @Alexander 明确一点,当我说“二进制环境”时,我的意思是我不想从二进制的运行目录定义环境变量(因为我无法控制存在的环境变量当应用程序分发时,并且不希望 API 密钥存储在我们的 git 存储库中)。例如,如果我能以某种方式将环境变量注入到某种 Swift 配置类中,并作为二进制文件的一部分进行编译,那将是一个理想的解决方案。
  • 您的脚本可以将 api 密钥注入 Swift 类的占位符,就像 Sombre 的回答所示。你也可以将它写入一个 plist/xml/json/yaml/whatever 文件中,该文件将被捆绑到你的应用程序中,并在运行时从那里读取。

标签: swift xcode compilation api-key


【解决方案1】:

您可以在 Xcode 构建部分执行预操作脚本

这将使用以下代码修改占位符:

let apiKey : String = "<# THE_API_KEY #>"

直接在源文件中修改代码

在每次构建之前。

如果您在存档预操作中有生产密钥,则可以添加另一个

示例

apiKey 变量放入您要访问的文件中

Pre-action 中编写一个脚本来替换占位符文本,例如THE_API_KEY

脚本如下所示

 cat $PROJECT/$PATH_TO_FILE | sed 's/THE_API_KEY/YOUR_KEY' > $PROJECT/$PATH_TO_FILE

不要忘记清理代码以避免将 API 密钥放入提交中

Post-action

cat $PROJECT/$PATH_TO_FILE | sed 's/YOUR_KEY/THE_API_KEY' > $PROJECT/$PATH_TO_FILE

【讨论】:

  • 这能让我在其他源文件中引用apiKey 吗?我的应用程序中有一个特定的类来处理需要访问该 API 变量的 API 初始化。虽然 pre-action 变量似乎不是全局范围的,因此在我的其他源文件中无法访问。
  • apiKey 是一个全局变量,因此您可以决定为它提供哪种访问控制
  • 你的脚本会修改写入变量的swift文件,使用$PROJECTDIRXcode变量
  • 在所有目标源文件中都可以访问具有全局/内部范围的变量如果您想限制到一个文件,请使用fileprivate
  • 我不清楚你提供的用法。 let apiKey : String = "&lt;# THE_API_KEY #&gt;" 是否进入预操作运行脚本?或者在我想使用它的源文件中?另外,我以前从未见过 &lt;# #&gt; 语法,也没有在 Swift 文档中的任何地方找到它的描述,它有什么作用?它显然有一些特殊的含义,当你输入它时 Xcode 会以不同的方式格式化它,但我没有看到它记录在任何地方
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2022-09-23
  • 2014-09-30
  • 1970-01-01
相关资源
最近更新 更多