Ошибка Xcode 8 на iOS 9.2 и ниже

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

Ответ 1

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

Вы можете сохранить 16-разрядные активы как 8-битные с Preview.app

Как решить "ERROR ITMS-90682: Недействительный пакет - Каталог активов в разделе" Полезная нагрузка /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. Следующие шаги описывают процесс:

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

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

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

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

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

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

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

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

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

Ответ 2

Я надеюсь, что этот bash script может вам помочь. Входной аргумент - это каталог, который содержит все xcassets вашего проекта. Этот script установит профиль 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 "------------------------------"

Ответ 3

Я смог воспроизвести проблему, и это похоже на изображения в Каталоге активов. Подана ошибка с Apple (с прилагаемым примером проекта)

Apple Bug Reporter: 28371396

Ответ 4

отредактирован script для преобразования файлов 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 "------------------------------"

Ответ 5

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

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

в xcode

Ответ 6

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

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

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

Ответ 7

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

В моем случае мой проект был настроен на iOS 9.1, а Target был установлен на iOS 8.0 и сбой на симуляторе с iOS 8.4

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

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

Ответ 8

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

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

TL;DR;

  • Архив
  • Разархивировать ipa
  • Скомпилировать активы. Вы можете найти команду компилятора активов для своего проекта, сгенерированного с помощью xcode, проверив архивные журналы в Xcode report navigator

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

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. Resign