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

问题描述 投票:0回答:1

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

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

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

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

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

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

xcode xcodebuild fastlane ios-app-extension conditional-compilation
1个回答
1
投票

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

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

function embedExtensions() {
    for extension in $1
    do
        rsync -r --exclude .DS_Store --exclude CVS --exclude .svn --exclude .git --exclude .hg --exclude Headers --exclude PrivateHeaders --exclude Modules --exclude \*.tbd --copy-links "${CONFIGURATION_BUILD_DIR}/${extension}.appex" "${CONFIGURATION_BUILD_DIR}/${PLUGINS_FOLDER_PATH}"
    done
}

debug_extensions=("PacketTunnelProvider WidgetExtension ShareExtension")
beta_extensions=("PacketTunnelProvider WidgetExtension")

if [ "${CONFIGURATION}" = "Debug" ]
then
    embedExtensions $debug_extensions
elif [ "${CONFIGURATION}" = "Beta" ]
then
    embedExtensions $beta_extensions
fi

我通过查看 Xcode 的嵌入应用程序扩展构建阶段的构建输出发现了这一点,该阶段使用 Xcode 内部工具

builtin-copy
。但是
rsync
实现了相同的结果并且具有大致相同的选项。

© www.soinside.com 2019 - 2024. All rights reserved.