如何使用自定义Xcode Cloud环境变量?

gre*_*rey 10 xcode swift xcode-cloud

environment variables我们在Xcode 方案中有这些

在此输入图像描述

这段代码在本地运行良好

let webHost = ProcessInfo.processInfo.environment["HOST_URL"]!
let apiHost = ProcessInfo.processInfo.environment["API_URL"]!
let beamsKey = ProcessInfo.processInfo.environment["BEAMS_KEY"]!
let mixpanelKey = ProcessInfo.processInfo.environment["MIXPANEL_KEY"]!
Run Code Online (Sandbox Code Playgroud)

但是,当使用Xcode Cloud与相同的environment variables.

在此输入图像描述

它构建成功,但应用程序因该日志而崩溃。

在此输入图像描述

使用Xcode Cloud时读取这些环境变量的正确方法是什么?

gme*_*tax 6

我有一个类似的问题,主要是我想api-key在项目中添加一个,而源代码中不存在这个问题。所以我必须创建一个ci_pre_xcodebuild.sh文件

#!/bin/sh

echo "Stage: PRE-Xcode Build is activated .... "

# for future reference
# https://developer.apple.com/documentation/xcode/environment-variable-reference

cd ../ProjectName/

plutil -replace API_KEY_DEBUG -string $API_KEY_DEBUG Info.plist
plutil -replace API_KEY_RELEASE -string $API_KEY_RELEASE Info.plist

plutil -p Info.plist

echo "Stage: PRE-Xcode Build is DONE .... "

exit 0
Run Code Online (Sandbox Code Playgroud)

在代码中我们有

#!/bin/sh

echo "Stage: PRE-Xcode Build is activated .... "

# for future reference
# https://developer.apple.com/documentation/xcode/environment-variable-reference

cd ../ProjectName/

plutil -replace API_KEY_DEBUG -string $API_KEY_DEBUG Info.plist
plutil -replace API_KEY_RELEASE -string $API_KEY_RELEASE Info.plist

plutil -p Info.plist

echo "Stage: PRE-Xcode Build is DONE .... "

exit 0
Run Code Online (Sandbox Code Playgroud)

  • 当它位于 ci_pre_xcodebuild.sh 文件中时,我遇到了一些问题,但我将其移至 ci_post_clone.sh 并且在那里工作正常。另根据苹果文档:“ci_post_clone.sh - 克隆后脚本在 Xcode Cloud 克隆 Git 存储库后运行。您可以使用克隆后脚本来安装其他工具,或向属性列表添加新条目。 ” (2认同)

Pom*_*ule 5

所以,这绝对是一个令人头痛的问题,但我终于找到了一种令人满意的方法来在代码中访问和使用这些变量。

我的解决方案使用:

  • 用于本地存储变量的(gitignored)JSON 文件
  • Xcode Cloud 在 CI 中发送变量
  • ci_pre_xcodebuild.sh用于在 JSON 中写入环境变量的文件
  • 一个 Swift 文件,可让您方便地访问秘密。

第 1 步:基本 JSON 文件

  • 在 .gitignore 文件中,为 JSON 文件及其路径添加一个新条目
  • 通过 Xcode 创建 JSON 文件
  • 将您的密钥添加到此 JSON 文件中。
Secrets.json

(位于:YourProject/SupportingFiles/secrets.json)

{
    "STRIPE_KEY": "",
    "GOOGLE_MAPS_KEY": "",
    "GOOGLE_PLACES_KEY": "",
    "BASE_URL": "https://dev.api.example.fr"
}

Run Code Online (Sandbox Code Playgroud)

步骤2:在Xcode Cloud中写入变量

Xcode Cloud 作业中设置的环境值

在此屏幕截图中,您可以看到我为不同的环境复制了密钥。为了简洁起见,我没有对此进行扩展,但是对于不同的 Xcode 方案配置,您绝对可以拥有不同的秘密 JSON 文件。

第 3 步:添加ci_pre_xcodebuild.sh文件

重要提示:文件的名称及其位置很重要。

这里的目标是添加 CI (Xcode Cloud) 每次构建时都会执行的脚本。在此脚本中,我们将创建并填充 JSON。

  1. 在项目的根目录添加一个名为“ci_scripts”的新组

使用底部加号按钮添加组

  1. 在此组中,添加一个名为的新文件ci_pre_xcodebuild.sh

  2. 写下以下内容:

#!/bin/sh

echo "Stage: PRE-Xcode Build is activated .... "

# Move to the place where the scripts are located.
# This is important because the position of the subsequently mentioned files depend of this origin.
cd $CI_WORKSPACE/ci_scripts || exit 1

# Write a JSON File containing all the environment variables and secrets.
printf "{\"STRIPE_KEY\":\"%s\",\"GOOGLE_MAPS_KEY\":\"%s\",\"GOOGLE_PLACES_KEY\":\"%s\",\"BASE_URL\":\"%s\"}" "$STRIPE_KEY" "$GOOGLE_MAPS_KEY" "$GOOGLE_PLACES_KEY" "$BASE_URL" >> ../Dream\ Energy/SupportingFiles/Secrets.json

echo "Wrote Secrets.json file."

echo "Stage: PRE-Xcode Build is DONE .... "

exit 0
Run Code Online (Sandbox Code Playgroud)

当然,您需要根据您的密钥和文件位置更改此文本。我添加了一些键作为示例。

  1. 在终端中,导航到新文件的文件夹并运行以下命令:chmod +x ci_pre_xcodebuild.sh。这修复了 Xcode Cloud 中的警告。

第 4 步:[奖励] 一个用于访问环境变量的简单 Swift 文件

import Foundation

struct Secrets {
    private static func secrets() -> [String: Any] {
        let fileName = "Secrets"
        let path = Bundle.main.path(forResource: fileName, ofType: "json")!
        let data = try! Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
        return try! JSONSerialization.jsonObject(with: data) as! [String: Any]
    }

    static var baseURL: String {
        return secrets()["BASE_URL"] as! String
    }

    static var stripeKey: String {
        return secrets()["STRIPE_KEY"] as! String
    }
}

Run Code Online (Sandbox Code Playgroud)


Van*_*lli 0

这些变量仅在临时环境处于活动状态以构建应用程序时可用且有效,而当应用程序在设备上运行时则不可用。

\n

但是,在使用 shell 脚本的构建过程中,环境变量可以是 \xe2\x80\x9ccaptured\xe2\x80\x9d (请参阅目标设置下的 Xcode“构建阶段”或 Xcode Cloud自定义构建脚本)。

\n

另一个好的解决方案是使用一些代码生成工具,例如Arkana。该工具创建混淆代码以使变量最终在运行时可用。

\n

同样,工具或 shell 脚本必须在 Xcode Cloud 环境中运行。执行此操作的步骤超出了本响应的范围。

\n