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

cod*_*man 14 xcode xcodebuild ios

我的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 Code Online (Sandbox Code Playgroud)

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

cp -rv "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我的应用程序无法构建,并说它无法找到应用程序图标并启动图像.有任何想法吗?

Mik*_*ers 27

这是你可以做的工作:

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

EXCLUDED_SOURCE_FILE_NAMES用于配置相关的资产目录

通过这样做,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.

  • 如果您有许多不同的配置,以下内容可能会派上用场:EXCLUDED_SOURCE_FILE_NAMES = Media*.xcassets INCLUDED_SOURCE_FILE_NAMES = MediaForAdHoc.xcassets这样您就不必逐个排除资产. (6认同)