在构建之后(但在安装之前)向 Info.plist 数组添加值

Posted

技术标签:

【中文标题】在构建之后(但在安装之前)向 Info.plist 数组添加值【英文标题】:Add value to Info.plist array after building (but before installing) 【发布时间】:2019-05-14 13:13:31 【问题描述】:

我有一个 Xcode 项目,它使用不同的配置构建到几个不同的应用程序(白标签)中。 对于新的付款方式,我需要每个应用程序都有一个唯一的CFBundleURLScheme

我在“构建阶段”中之前 Compile Sources 编写了以下“运行脚本”。

INFO_PLIST="$PROJECT_DIR/$INFOPLIST_FILE"
plutil -insert CFBundleURLTypes.0.CFBundleURLSchemes.0 -string "swish$PRODUCT_BUNDLE_IDENTIFIER//." $INFO_PLIST

这会添加值swishourbundleidentifier。 (所以,swish + our.bundle.identifier,但没有点)

这当前会更改实际的 Info.plist。我想要的是它更改了构建应用程序的文件夹中的 Info.plist,以便每次都将其覆盖(因此没有双值),并且附加值不会显示在 git 中。

我会怎么做呢?我猜它只是改变了"$PROJECT_DIR/$INFOPLIST_FILE",但改成什么?

如果需要更多信息,请告诉我。

编辑:实际上,如果可能的话,更好的解决方案是在 Info.plist 的 URL 方案中添加类似 swish$PRODUCT_BUNDLE_IDENTIFIER//. 的内容。这样它就在构建时编译为该值,但没有双精度值。我试过这个,但不幸的是它似乎没有那样工作。

【问题讨论】:

【参考方案1】:

您可以通过

访问构建目录
$CONFIGURATION_BUILD_DIR/$CONTENTS_FOLDER_PATH

参考:https://help.apple.com/xcode/mac/10.2/#/itcaec37c2a6

【讨论】:

绝对不是。这是包含(在所有其他文件中)您的 info.plist 的文件夹。您可以根据需要编辑、移动、重命名、删除它们。当然,您必须保证应用程序在您更改后可以正常工作。 好的!但这和项目文件中的 Info.plist 不一样吧? (例如,这是一个带有预构建文件的位置?) 这是生成构建的文件夹。执行脚本时,取决于您的构建阶段脚本顺序。编译源码后尝试运行脚本 我的提示:我的项目中有几个 info.plist 文件,例如 info_dev.plist、info_prod.plist 等。在编译源阶段之后我有一个运行脚本,将文件重命名为 info.plist 并删除另一个。 谢谢!我还没有实现它,但这听起来是正确的解决方案。非常感谢!关于多个 Info.plist 文件,一个很好的解决方案。目前我们有一个文件在构建过程中被更改(或使用 Fastlane 归档),但我确实想在将来更改它,因为更改一个构建设置可能会搞砸项目。【参考方案2】:

(Xcode 11.2)

可以按照你的要求去做:

您可以在$TARGET_BUILD_DIR/$INFOPLIST_PATH 获取应用程序包的Info.plist 的路径。

但是:在新构建系统中,任何自定义构建步骤都将在新构建系统的Process .../Info.plist 步骤之前运行,因此您不能 通过运行脚本步骤编辑应用程序包的 plist 以构建阶段,因为您的更改将被覆盖:

要在 Xcode 完成构建后运行 shell 脚本,您可以将其作为构建后操作添加到您的方案中:

Product > Scheme > Edit Scheme... > Build > Post-actions

如果您要引用任何构建系统环境变量(例如 BUILT_PRODUCTS_DIRINFOPLIST_PATH),请确保在 Provide build settings from 中选择您的应用目标。

添加您的 shell 脚本,但请记住,如果您编辑应用程序包中的任何文件(即Info.plist),您需要重新签署应用程序。将此添加到您的脚本中:

export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate
/usr/bin/codesign --force --sign - --entitlements "$TARGET_TEMP_DIR/$FULL_PRODUCT_NAME.xcent" --timestamp=none "$CODESIGNING_FOLDER_PATH"

【讨论】:

【参考方案3】:

App bundle 是只读的。 Info.plist 在应用程序包中

【讨论】:

嗯,好吧。因此,一种方法是在构建之前将密钥添加到Info.plist,然后将其删除after 构建。使用运行脚本可以吗?所以一个 before compile sources 和一个 after copy bundle resources? 我的答案适合在应用运行时更改 info.plist 文件。使用Run script 预构建更改值 不幸的是,@JeroenJK 无法通过构建阶段步骤完成。看我的回答。

以上是关于在构建之后(但在安装之前)向 Info.plist 数组添加值的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:Runner.app/Info.plist 不存在。 Flutter“精简二进制”构建阶段必须在“复制捆绑资源”之后运行

使用 CocoaPods 安装的框架的构建设置中的空 Info.plist 路径

Info.plist 表示 Mac 应用程序,但在使用 Application Loader 提交时提交了 ipa

CFBundleUrlTypes 在 Info.plist 中可见,但在它的 XCode 视图中不可见

Xcode 11 Swift 5 - 无法安装应用程序(无法加载 info.plist 文件)

Xcode中的Info.plist字段列表详解