有条件地构建具有不同资产目录的应用程序

时间:2015-02-11 16:08:18

标签: ios xcode xcodebuild

我的XCode项目以多种配置的方式设置,允许我为我的应用程序的不同变体使用相同的代码库,但每个都有独特的元素,如应用程序名称,版本,包标识符,图标,启动屏幕,等我已经关注这个网站,以完成大部分设置: http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/

我还有一个config.plist,其中包含与每个XCode配置相关联的各种唯一设置,这些设置只能在构建时成功复制。以下是运行脚本构建阶段的片段:

RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/${CONFIGURATION}

BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app

echo "Copying all files under ${RESOURCE_PATH} to ${BUILD_APP_DIR}"
cp -v "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"

我的下一个目标是能够在构建时复制特定配置的资产目录,以避免将所有不同配置的图像捆绑到构建中,从而导致它变得臃肿。我使用Run Script尝试了与上面相同的解决方案,更改了复制行以包含递归选项(因为资产目录本质上是一个目录):

cp -rv "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"

然而,当我这样做时,我的应用程序无法构建并说它无法找到应用程序图标并启动图像。有什么想法吗?

1 个答案:

答案 0 :(得分:24)

这是你可以做的工作:

  • 为每个配置添加单独的资产目录,就像通常将资产目录添加到项目中一样。让我们假设这个例子我们称这些目录为MediaForDebug.xcassets,MediaForAdHoc.xcassets和MediaForRelease.xcassets
  • 确保新创建的资产目录都是目标的成员(因此请勿在此处将其排除,我们稍后会这样做)
  • 现在,如果尚未添加到您的构建设置中,请添加自定义EXCLUDED_SOURCE_FILE_NAMES用户定义设置。
  • 请参阅下面的屏幕截图,了解为此用户定义设置设置的值。

EXCLUDED_SOURCE_FILE_NAMES for config dependant asset catalogs

通过这样做,Xcode将只编译适当的资产目录,而忽略其他资产目录。我已经在我们的一个项目中对此进行了测试,并且按预期工作。

祝你好运!

备注:如果您正在使用CocoaPods,您可能会遇到麻烦,因为CocoaPods会添加自己的构建步骤来编译您的资产,并将您的依赖项添加到.car文件中。有关此问题的讨论,请参阅https://github.com/CocoaPods/CocoaPods/issues/1546。 TL; DR:确保此步骤不在构建阶段执行,或者编辑它们执行的CocoaPods脚本以不进行资产构建。

更新时间:2009年1月19日:使用最新的稳定Xcode(10.1)和Cocoapods(v1.5.3),它们开箱即用。无需更改Cocoapods脚本或构建步骤,只需按照描述设置EXCLUDED_SOURCE_FILE_NAMES