应用扩展可以有条件地包含在构建中吗?

Col*_*lay 5 xcode conditional-compilation xcodebuild ios-app-extension fastlane

我正在开始开发 2 个应用程序扩展,我想按如下方式设置我的构建:

  • 面向 App Store 的构建不应包含任何扩展
  • 用于 TestFlight 的构建应包括几乎准备就绪的扩展
  • 本地构建应包含两个扩展

目前,我对每个项目都有不同的构建配置,以显示和隐藏应用程序的其他方面(在某些情况下也包括编译器标志)。我使用 fastlane 来进行构建。

据我所知,添加或删除应用程序扩展的唯一方法是:

  • 将主目标复制两次,并为上述每个构建使用一个(缺点 - 必须维护 3 个目标副本,直到扩展完全完成)
  • 在构建之前手动添加/删除扩展(缺点 - 无法从 CI 环境中的给定分支构建 TestFlight 和 App Store,因为需要手动干预)

有人能想出更好的解决方案来有条件地包含应用程序扩展吗?

Gra*_*hur 1

这可以通过向主要目标添加运行脚本构建阶段来完成。

\n

添加此脚本并将配置名称替换为您自己的构建配置名称,并将扩展名替换为您想要为每个配置包含的扩展名:

\n
function embedExtensions() {\n    for extension in $1\n    do\n        rsync -r --copy-links "${CONFIGURATION_BUILD_DIR}/${extension}.appex" "${CONFIGURATION_BUILD_DIR}/${PLUGINS_FOLDER_PATH}"\n    done\n}\n\ndebug_extensions=("PacketTunnelProvider WidgetExtension ShareExtension")\nbeta_extensions=("PacketTunnelProvider WidgetExtension")\n\nif [ "${CONFIGURATION}" = "Debug" ]\nthen\n    embedExtensions $debug_extensions\nelif [ "${CONFIGURATION}" = "Beta" ]\nthen\n    embedExtensions $beta_extensions\nfi\n
Run Code Online (Sandbox Code Playgroud)\n

我通过查看使用 Xcode 内部工具的 Xcode\xe2\x80\x99s Embed App Extensions Build Phase 的构建输出发现了这一点builtin-copy。但rsync达到相同的结果并具有大致相同的选项。--copy-links需要该选项来解析符号链接.appex包。

\n