Условно создайте приложение с различными каталогами активов

Мой проект XCode настроен таким образом, что он имеет несколько конфигураций, что позволяет мне использовать одну и ту же базу кода для различных вариантов моего приложения, но имеет уникальные элементы в каждом, такие как имя приложения, версия, идентификатор пакета, значок, запуск экран и т.д. Я следил за этим сайтом, чтобы выполнить большую часть настройки: http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/

У меня также есть config.plist, содержащий различные уникальные настройки, связанные с каждой конфигурацией XCode, которая успешно копируется только при ее создании. Здесь приведен фрагмент фазы запуска Script, чтобы сделать это:

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

Вот что вы можете сделать, чтобы сделать эту работу:

  • Добавьте отдельный каталог активов для каждой конфигурации, так же, как вы обычно добавляете каталог активов в свой проект. Предположим для этого примера, что мы называем эти каталоги 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, который они выполняют, чтобы не создавать ресурсы.

ОБНОВЛЕНИЕ 19.01.2009: С последним стабильным Xcode (10.1) и Cocoapods (v1.5.3) они работают из коробки с решением выше. Нет необходимости изменять скрипты Cocoapods или этапы сборки, просто установите EXCLUDED_SOURCE_FILE_NAMES как описано.