【问题标题】:Add value to Info.plist array after building (but before installing)在构建之后(但在安装之前)向 Info.plist 数组添加值
【发布时间】: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//.} 的内容。这样它就在构建时编译为该值,但没有双精度值。我试过这个,但不幸的是它似乎没有那样工作。

【问题讨论】:

    标签: ios xcode info.plist


    【解决方案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 无法通过构建阶段步骤完成。看我的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多