Сбой сборки Xcode 8 на iOS 9.2 и ниже

85

Когда я создаю свое приложение с Xcode 8 GM Seed и запускаю его на iOS 9.2 ниже устройства ИЛИ симулятора, я получаю странные сбои EXC_BAD_ACCESS во время запуска приложения или через несколько секунд после запуска приложения. Сбой всегда происходит в другом месте (добавление подпредставления,, [UIImage imageNamed:]основного метода делегата приложения и т. Д.). Я не получаю этих сбоев, когда запускаю его на iOS 9.3+ или 10, и я не получаю их, когда я создаю с Xcode 7 и запускаю на iOS 9.2 и ниже. Кто-нибудь еще испытывает нечто подобное? Это известная проблема с Xcode 8?

Линчжи Чжан
источник
Сначала сбросьте содержимое симулятора. и попробуй еще раз.
Mehul
3
Удалось ли вам решить вашу проблему? У нас тоже это есть.
animaonline
Можете ли вы зарегистрировать новую ошибку на bugreport.apple.com и приложить образец проекта и журналы сбоев, чтобы мы могли изучить ее?
Куинн Тейлор
@QuinnTaylor - Я отправил отчет об ошибке с прикрепленным проектом (воспроизведенным на 100% в симуляторе) на bugreport.apple.com # 28371396. Спасибо, что изучили это!
Евтим Георгиев
3
@EvtimGeorgiev Спасибо! Это дубликат ошибки iOS, связанной с изображениями P3 .png, и должен быть исправлен в бета-версии SDK iOS 10.1, включенной в бета-версию Xcode 8.1, которая была выпущена сегодня. Можете ли вы попробовать построить на этом?
Куинн Тейлор

Ответы:

55

См. Принятый ответ https://forums.developer.apple.com/thread/60919.

Вы можете сохранять 16-битные ресурсы как 8-битные с помощью Preview.app

Как устранить ошибку «ERROR ITMS-90682: Invalid Bundle - Каталог ресурсов в« Payload / XXXXX / Assets.car »не может содержать 16-битные ресурсы или ресурсы P3, если приложение поддерживает iOS 8 или более раннюю версию».

В Xcode 8 GM эта ошибка возникнет, если вы включите 16-битные ресурсы или ресурсы P3 в отправку приложения, ориентированного на выпуски iOS более ранние, чем iOS 9.3. Если вашему приложению требуется широкая цветовая функциональность, вы должны изменить цель развертывания на iOS 9.3 или новее. Если вашему приложению не требуется широкая цветовая функциональность и вы хотите развернуть его в более старых версиях iOS, вам следует заменить все 16-битные ресурсы или ресурсы P3 на 8-битные ресурсы sRGB. Вы можете найти 16-битные ресурсы или ресурсы P3, запустив «assetutil» в каталоге ресурсов, названном в сообщении об ошибке из iTunes Connect. Следующие шаги описывают процесс:

  1. Создайте файл Inspectable .ipa. В Xcode Organizer (Xcode-> Window-> Organizer) выберите архив для проверки, нажмите «Экспорт ...» и выберите «Экспорт для корпоративного или специального развертывания». Это создаст локальную копию файла. ipa-файл для вашего приложения.

  2. Найдите этот файл .ipa и измените его расширение на .zip.

  3. Разверните файл .zip. Это создаст папку Payload, содержащую ваш пакет .app.

  4. Откройте терминал и измените рабочий каталог на верхний уровень вашего .app пакета cd path / to / Payload / your.app

  5. Используйте инструмент поиска, чтобы найти файлы Assets.car в вашем пакете .app, как показано ниже: find. -name 'Assets.car'

  6. Используйте инструмент assetutil, чтобы найти любые 16-битные ресурсы или ресурсы P3 в каждом Assets.car вашего приложения, как показано ниже. :sudo xcrun --sdk iphoneos assetutil --info /path/to/a/Assets.car > /tmp/Assets.json

  7. Изучите полученный /tmp/Assets.json и найдите все содержимое, содержащее «DisplayGamut»: «P3» и связанное с ним «Name». Это будет имя вашего набора изображений, содержащего один или несколько 16-битных ресурсов или ресурсов P3.

  8. Замените эти ресурсы ресурсами 8-бит / sRGB, а затем перестройте приложение.

Обновление: если для вашей цели развертывания установлено значение 8.3 или 8.4 и у вас есть каталог активов, вы получите то же сообщение об ошибке, даже если у вас на самом деле нет 16-битных ресурсов или ресурсов P3. В этом случае вам нужно будет либо снизить целевое значение развертывания до 8,2, либо повысить его до 9.x.

Костя Домбровский
источник
2
Как это связано с EXC_BAD_ACCESS?
animaonline
1
Пожалуйста, не повторяйте ответы. Вместо этого помечайте вопросы как повторяющиеся.
JAL
Спасибо, мужик! С этим ответом ты сэкономил мне массу времени! )
Thorax
3
В моем проекте (цель развертывания - 8.0) нет ресурсов P3. Я получаю сбой в приложении или случайным образом в любом месте с xcode 8. Все ресурсы имеют 8-бит / sRGB. Кто-нибудь все еще сталкивается с этой же проблемой
Ankit
@Ankit, мы сталкиваемся с той же проблемой. Вы уже нашли решение?
Роман Труба
32

Надеюсь, этот сценарий bash может вам помочь. Входной аргумент - это каталог, содержащий все xcasset-ы вашего проекта. Этот скрипт установит профиль sRGB для всех png. Мне помогло :)

#!/bin/bash
DIRECTORY=$1
echo "------------------------------"
echo "Passed Resources with xcassets folder argument is <$DIRECTORY>"
echo "------------------------------"
echo "Processing asset:"
XSAASSETSD="$(find "$DIRECTORY" -name '*.xcassets')"
for xcasset in $XSAASSETSD
do
    echo "---$xcasset"
    IMAGESETS="$(find "$xcasset" -name '*.imageset')"
    for imageset in $IMAGESETS
    do
        echo "------$imageset"
        FILES="$(find "$imageset" -name '*.png')"
        for file in $FILES 
        do
            echo "---------$file"
            sips -m "/System/Library/Colorsync/Profiles/sRGB Profile.icc" $file --out $file
        done
    done
done
echo "------------------------------"
echo "script successfully finished"
echo "------------------------------"
Александр Терентьев
источник
Наши ресурсы не содержат дефектных изображений, но мы все равно получаем эти ошибки.
animaonline
@animaonline, Помогает, действительно ли приложение содержит 16-битные или P3-ресурсы.
Александр Терентьев
2
Я думаю, что основная проблема в том, что на самом деле никто не подтвердил, что эта ошибка вызвана активами.
animaonline
сначала работало, а потом нет, просто там же не
вылетает
1
Сценарий у меня не сработал, но использование ImageOptim сработало
deej
16

Мне удалось воспроизвести проблему, и она, похоже, связана с изображениями в каталоге активов. Сообщил об ошибке в Apple (с приложенным образцом проекта)

Репортер об ошибках Apple: 28371396

Евтим Георгиев
источник
Я не могу скачать образец проекта. Можете ли вы поделиться проектом по воспроизведению аварии?
Тамил
Спасибо. Проблемы, связанные с Каталогом активов, просто измените цветовое пространство с Adobe RGB (1998) на sRGB.
Тимур Берникович
13

отредактированный скрипт для преобразования файлов png в правильный формат во всем проекте и с пробелами:

#!/bin/bash
DIRECTORY=$1
echo "------------------------------"
echo "Passed Resources with xcassets folder argument is <$DIRECTORY>"
echo "------------------------------"
echo "Processing asset:"

find "$DIRECTORY" -name '*png' -print0 | while read -d $'\0' file; 
do 
    echo "---------$file"
    sips -m "/System/Library/Colorsync/Profiles/sRGB Profile.icc" "$file" --out "$file"
done

echo "------------------------------"
echo "script successfully finished"
echo "------------------------------"
Никита Конопелько
источник
1
Этот скрипт немного точнее. Спасибо, Никита.
Seelts
1
Это работает как шарм. Простой, но эффективный сценарий. Для людей, которые не знают, как запустить этот скрипт .. Шаги: 1) Поместите этот скрипт в текстовый файл и переименуйте его в AssetsScript.sh 2) Перейдите в папку, содержащую изображения Images.xcassets, и сохраните файл скрипта 3) В командной строке перейдите в папку, в которой существует ваш файл сценария. 4) Измените права доступа к файлам сценария на исполняемый файл (chmod 755 AssetsScript.sh). 5) Выполните файл сценария с именем каталога в качестве параметра в самой командной строке (./AssetsScript.sh Images.xcassets). Бум, это преобразует все ваши активы в требуемый формат и готово. Приложение теперь работает нормально.
Srivathsa
В одной строке, while IFS= read -d '' -r file; do if [ $(file "$file" | grep -c '16-bit') -eq 1 ]; then sips -m '/System/Library/Colorsync/Profiles/sRGB Profile.icc' "$file"; fi done < <(find . -print0)которая просто преобразует 16-битное изображение в 8-битное
DawnSong
3

та же проблема.

Я не уверен, что это ошибка, но вот мое решение: убедитесь, что ваши изображения не содержат цветовое пространство Adobe RGB (1998).

в xcode

пинг
источник
1
Что вы имеете в виду? Не могли бы вы уточнить?
animaonline
1
Отображение изображения с цветовым пространством Adobe RGB (1998) работало для меня при отладке на устройстве с Xcode 8 и Swift 3, но не было в выпуске на iOS 9. Изменение цветового пространства заставило меня работать.
Эндрю
1

Добавление для всех, у кого есть аналогичная проблема ...

Приложение вылетало на iOS 9.0 - iOS 9.2 из-за того, что казалось случайным / вокруг переходов раскадровки / вокруг установки UIImage (имя ...). Нашел эту ветку: ( https://forums.developer.apple.com/thread/61643 )

Если ваше приложение нацелено на iOS 8.4, оно выйдет из строя на iOS 9.0 - 9.2 в Xcode 8 .. что-то связано с xcasset. Установка цели развертывания на 8.2 или ниже (я использовал 8.0) исправила это для меня. Без шуток. Худшая ошибка на свете.

Карнетт
источник
Здравствуй. Помогите! У меня такое наблюдается, кроме ТОЛЬКО в AppStore. Когда я создаю свое приложение прямо на iPhone с iOS 9.2.1, оно не вылетает, ни на симуляторе, но когда я загружаю ту же самую версию / сборку из AppStore, происходит сбой. Было ли это так и с вами?
Sti
@Sti нет, он вылетал в отладочной сборке. Вы используете основные данные или что-то еще, что может вызвать проблемы при перезаписи старой сборки? Просто мысль.
karnett
Хорошая мысль, и да, я использую основные данные в некоторых частях приложения. Но после долгого тестирования я совершенно уверен, что это не имеет отношения к этому. Основные данные не имеют ничего общего с моими изображениями, и почти все мои трассировки стека из моей системы отчетов о сбоях говорят, что UIImage (imageNamed :) - плохой парень. Да, и это тоже происходит при чистой установке. Более 7000 сбоев за последние два дня, затронув только iOS 9.0.2–9.2.1 .. Не iOS 9.3 или новее .. Странно. И этого не происходит, когда я его сейчас строю. Только AppStore. Невозможно отладить. Я только что отправил TSI-тикет в Apple.
Sti
Ох. Это липкий. Просто возникла еще одна мысль .. Какую версию Swift использует версия магазина приложений? Думаю, я испытал это в Swift 2.2 или 2.3. Не Swift 3. Я полагаю, вы сейчас работаете с Swift 3 и не можете его воспроизвести?
karnett
Нет, но очень интересно, что вы это говорите! Это приложение уже давно есть в App Store. Предыдущая версия в App Store была написана на Swift 2.3 и не имела этой ошибки. Эта новая версия в App Store, которую я загрузил несколько дней назад (та, которая дает сбой), имеет очень мало, но очень большие изменения, в том числе преобразована в Swift 3. Еще одно важное изменение - добавление виджета исключительно для iOS 10.
Sti
0

Установите для цели развертывания iOS в информации вашего проекта и всех целей одинаковое значение.

В моем случае мой Project был установлен на iOS 9.1, а Target был установлен на iOS 8.0 и вылетал на Simulator с iOS 8.4.

Теперь работает отлично.

PS: Очистите проект перед повторным запуском.

Густаво Барбоза
источник
0

Хотя на вопрос уже был дан ответ, принятое решение не работает для меня, так как у меня не было никаких ресурсов 16b / ch.

Я обнаружил, что эта проблема возникла для активов, которые были сжаты с использованием lzfseалгоритма (вы можете найти информацию о сжатии, извлекающей информацию из Assets.car, используя assetutil). К сожалению, Xcode IDE не позволяет разработчикам изменять алгоритм сжатия, однако вы можете сделать это, скомпилировав ресурсы вручную и снизив цель развертывания в actoolкоманде.

tl; dr;

  1. Архив
  2. Разархивировать ipa
  3. Компиляция ресурсов - вы можете найти команду компилятора ресурсов для вашего проекта, созданную с помощью xcode, проверив архивные журналы в навигаторе отчетов Xcode

Пример команды:

xcrun actool --output-format human-readable-text --notices --warnings --minimum-deployment-target 8.0 --output-partial-info-plist info_partial.plist --app-icon AppIcon --launch-image LaunchImage --enable-on-demand-resources YES --sticker-pack-identifier-prefix {bundle_id}.sticker-pack --target-device iphone --target-device ipad --platform iphoneos --product-type com.apple.product-type.application --compile #{path_to_directory_containing_Assets_car} Assets/Assets.xcassets

  1. Застегни это.
  2. В отставку
Badeleux
источник