在构建之后(但在安装之前)向 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 以构建阶段,因为您的更改将被覆盖:
Product > Scheme > Edit Scheme... > Build > Post-actions
如果您要引用任何构建系统环境变量(例如 BUILT_PRODUCTS_DIR
或 INFOPLIST_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 视图中不可见