编辑
2 个解决方案:
说实话,我认为XCConfig 解决方案要优雅得多。您只需将内容交换进出,而不是尝试以非常特定的顺序覆盖所有内容...
每个其他答案都有一部分是必要的。对这个 post 进行一些重要修改后,我能够把事情做好。
你需要做三件事:
- 更改 appex 的 bundleId(应用扩展)
- 更改捆绑包后重新签署 appex。虽然应用可以在模拟器上正确运行,但如果没有这一步,它将无法在真实设备上运行。
- 设置适当的配置文件。 (排除此答案,因为我还不知道该怎么做)
注意:在 appex 嵌入之前,您不能对其进行签名。因此,“重新签署 appex”步骤需要在“嵌入应用程序扩展”步骤之后进行。同样,如果 bundleId 没有以父应用的 bundleId 为前缀,则无法嵌入 appex。
最终的顺序应该是这样的:
改变appex的bundleId
plutil的sytanx是这样的:
-replace keypath -type value
那就这样吧:
plutil -replace \
CFBundleIdentifier -string \
$PRODUCT_BUNDLE_IDENTIFIER.contentExt \
"$BUILT_PRODUCTS_DIR/contentExt.appex/Info.plist"
如果您想了解更多关于plutil 的信息(请参阅here 和here 了解更多信息)。 PlistBuddy 有点老了。
注意: ContentExtension 是我的目标名称。确保你正确使用你的
重新签署appex
/usr/bin/codesign \
--force \
--sign $EXPANDED_CODE_SIGN_IDENTITY \
--entitlements $CONFIGURATION_TEMP_DIR/ContentExtension.build/ContentExtension.appex.xcent \
--timestamp=none \
"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME/$BUNDLE_PLUGINS_FOLDER_PATH/ContentExtension.appex"
注意: ContentExtension 是我的目标名称。确保你正确使用你的
最终结果是这样的:
不要忘记对每个目标重复这些步骤。确保正确的最佳方法是将 appex 的 bundleId 设置为完全错误的值,然后在真实设备上测试所有目标。如果您在 sim 上对其进行测试,那么您将无法验证代码签名是否正常工作。
FWIW 通常最好将所有 shell 转储到一个目录中,然后从那里引用它们。但是为了这篇文章的简单起见,我没有这样做。
还要确保你看到original gist,如果你用它来改变你所有的appexes,它会更聪明。您只需要传递应用程序的名称,然后它就会找出其余的...