Изображения.xcassets нарушает законы мишеней
Хорошо, я вырываю свои зубы из-за этого, и я искренне надеюсь, что совершил глупую ошибку (были некоторые поздние ночи, связанные с этим).
Короткая предыстория, мы создаем продукт, который должен быть бренд-способным, так как несколько клиентов будут использовать 90% одного и того же пользовательского интерфейса и кода, с некоторыми настройками для включения / выключения и различными цветами, шрифтами и изображениями и т. д.
Все работают нормально, кроме самого .папки xcassets. У меня есть 1 клиент, в настоящее время они имеют тот же актив имена, с разными изображениями. Например, каждый из них .xcassets имеет ic_settings
, но содержимое отличается для каждого.
Я проверил фазу сборки ресурсов пакета копирования, и для каждой цели он фактически имеет только 1 из них .папки xcasset для каждого.
<redacted image>
<redacted image>
Когда я запускаю приложение, оно правильно загружает appIcon (который я должен был переименовать в appIcon-<target>
, потому что выпадающий список в Xcode показывал их все и не мог знать, что есть что). Это также отображает правильное имя пакета и экран запуска.xib.
Ниже приведены сами изображения. Как вы можете видеть, изображения совершенно разные:
<redacted image>
<redacted image>
Я не знаю, как это физически возможно, пожалуйста, скажите мне:
- я не сумасшедший
- я совершил какую-то простую ошибку, которую просто не вижу
- это не ошибка Xcode и не потребует больше всего тщательно продуманная работа вокруг человека, которого вид когда-либо видел. Возможно переименование всех изображений, чтобы добавить имя цели, а также :-(.
Примечание
Я пробовал чистить, строить, сбрасывать симулятор, удалять производные данные и т. д. Как на симуляторе, так и на реальном устройстве.
Если я добавляю уникальный образ в одну из папок, я могу его использовать. Интуиция подсказывает, что Xcode объединяет папки????
Обходной путь
Помечено ответ правильный, он был cocoapods. Это известная проблема, и в настоящее время лучший обходной путь (я нашел), чтобы использовать это: https://github.com/CocoaPods/CocoaPods/issues/1546#issuecomment-61907975
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
Существует кодовый блок, который выглядит следующим образом
Он компилирует все каталоги активов в пути сборки, поскольку он не может разумно сказать, какие каталоги активов принадлежат какой цели в данный момент. Вам нужно удалить эту часть сценария. Если вам нужны каталоги активов из ваших модулей, вам придется добавить их вручную. Вам нужно будет возвращать изменения в этот файл каждый раз, когда вы запускаете pod install. Хорошая новость в том, что ты не сходил с ума. Получайте удовольствие: Dif [[ -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