如何在构建期间以编程方式将文件作为资源包含在Xcode中?

时间:2012-03-22 05:23:00

标签: xcode build-automation

我有一个由在构建阶段运行的脚本创建的文件。因此,该文件在构建时间之前不存在。

如何将文件添加到app / project以便我的代码可以在运行时访问它?

我知道文件名是什么。

通常情况下,如果我手动创建文件,我只需将其拖放到Xcode中,然后我就可以使用代码中的文件名立即访问它。由于我在构建期间生成文件,因此我想知道如何将其添加到项目中。

编辑:我添加的文件是一个图像文件,它是在构建阶段由脚本创建的。我希望能够在我的产品中运行时访问此文件。

3 个答案:

答案 0 :(得分:2)

我最终使用了构建引用。

答案 1 :(得分:1)

您可以创建文件并将其添加到项目中,然后在构建阶段,您的脚本可以用生成的文件替换现有文件....

另一个选择是尝试操作项目文件本身,但这非常复杂。这里有一些resources on the subject ...

答案 2 :(得分:0)

您可以使用这样的脚本将生成的文件复制到构建输出中,因为我可以使用该脚本复制具有在版本控制之外保留的值的plist,因为任何复制到“ $ {BUILT_PRODUCTS_DIR} / $ {FULL_PRODUCT_NAME} /”的文件都可用使用NSBundle API。

SECRETS="${SRCROOT}/../../secrets/Secrets.plist"
APP="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/Secrets.plist"
if [ -f "$SECRETS" ]; then
    cp -f "$SECRETS" "$APP"
    echo "copied Secrets.plist: $APP"
else
    echo "Secrets.plist not found at $SECRETS, all secrets will be 'MISSING'"
fi

例如,该秘密plist定义为Decodable结构SecretsFile并加载了

    private static var file: SecretsFile? = {
        guard let url = Bundle.main.url(forResource: "Secrets", withExtension: "plist"),
              let data = try? Data(contentsOf: url) else { return nil }
        return try? PropertyListDecoder().decode(SecretsFile.self, from: data)
    }()