Изображения.xcassets нарушает законы мишеней


Хорошо, я вырываю свои зубы из-за этого, и я искренне надеюсь, что совершил глупую ошибку (были некоторые поздние ночи, связанные с этим).

Короткая предыстория, мы создаем продукт, который должен быть бренд-способным, так как несколько клиентов будут использовать 90% одного и того же пользовательского интерфейса и кода, с некоторыми настройками для включения / выключения и различными цветами, шрифтами и изображениями и т. д.

Все работают нормально, кроме самого .папки xcassets. У меня есть 1 клиент, в настоящее время они имеют тот же актив имена, с разными изображениями. Например, каждый из них .xcassets имеет ic_settings, но содержимое отличается для каждого.

Я проверил фазу сборки ресурсов пакета копирования, и для каждой цели он фактически имеет только 1 из них .папки xcasset для каждого.

<redacted image>

<redacted image>

Когда я запускаю приложение, оно правильно загружает appIcon (который я должен был переименовать в appIcon-<target>, потому что выпадающий список в Xcode показывал их все и не мог знать, что есть что). Это также отображает правильное имя пакета и экран запуска.xib.

Ниже приведены сами изображения. Как вы можете видеть, изображения совершенно разные:

<redacted image> <redacted image>

Но когда я запускаю customer 1 и customer 2. Все изображения принадлежат клиенту 1.

Я не знаю, как это физически возможно, пожалуйста, скажите мне:

  1. я не сумасшедший
  2. я совершил какую-то простую ошибку, которую просто не вижу
  3. это не ошибка Xcode и не потребует больше всего тщательно продуманная работа вокруг человека, которого вид когда-либо видел. Возможно переименование всех изображений, чтобы добавить имя цели, а также :-(.

Примечание

Я пробовал чистить, строить, сбрасывать симулятор, удалять производные данные и т. д. Как на симуляторе, так и на реальном устройстве.

Если я добавляю уникальный образ в одну из папок, я могу его использовать. Интуиция подсказывает, что Xcode объединяет папки????

Обходной путь

Помечено ответ правильный, он был cocoapods. Это известная проблема, и в настоящее время лучший обходной путь (я нашел), чтобы использовать это: https://github.com/CocoaPods/CocoaPods/issues/1546#issuecomment-61907975

1 3

1 ответ:

Оказывается, если вы хотите скомпилировать XCAsset пакеты, вы должны указать все из них в XCAsset complier во время компиляции активов. Для поддержки файлов XCAsset cocoa pods компилирует все ресурсы, которые он может найти, в один целевой объект

См. https://github.com/CocoaPods/CocoaPods/pull/1427#issuecomment-26978591

И https://github.com/CocoaPods/CocoaPods/issues/1546#issuecomment-43137780

Ваше решение заключается в том, что вам нужно изменить любые файлы, созданные стручками какао в ./Pods/Target Support Files/Pods-(pod target)/Pods-(pod target)-resources.sh

Существует кодовый блок, который выглядит следующим образом

if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ]
then
  case "${TARGETED_DEVICE_FAMILY}" in
    1,2)
      TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
      ;;
    1)
      TARGET_DEVICE_ARGS="--target-device iphone"
      ;;
    2)
      TARGET_DEVICE_ARGS="--target-device ipad"
      ;;
    *)
      TARGET_DEVICE_ARGS="--target-device mac"
      ;;
  esac
  find "${PWD}" -name "*.xcassets" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
fi
Он компилирует все каталоги активов в пути сборки, поскольку он не может разумно сказать, какие каталоги активов принадлежат какой цели в данный момент. Вам нужно удалить эту часть сценария. Если вам нужны каталоги активов из ваших модулей, вам придется добавить их вручную. Вам нужно будет возвращать изменения в этот файл каждый раз, когда вы запускаете pod install. Хорошая новость в том, что ты не сходил с ума. Получайте удовольствие: D