Аварія збірки 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?


Спочатку скиньте вміст тренажера. і спробуйте ще раз.
Мехул

3
Чи змогли ви вирішити вашу проблему? У нас це теж є.
animaonline

Чи можете ви подати нову помилку на bugreport.apple.com та приєднати зразок проекту та журнали збоїв, щоб ми могли дослідити?
Quinn Taylor

@QuinnTaylor - Я подав звіт про помилку з доданим проектом (100% відтворений для мене в симуляторі) на bugreport.apple.com # 28371396. Дякуємо, що вивчили це!
Євтим Георгієв

3
@EvtimGeorgiev Дякую! Це копія помилки iOS, пов’язаної з зображеннями P3 .png, і її слід виправити в бета-версії SDK для iOS 10.1, включеної в бета-версію Xcode 8.1, яка вийшла сьогодні. Чи можете ви спробувати побудувати з цим?
Quinn Taylor

Відповіді:


55

Дивіться прийняту відповідь https://forums.developer.apple.com/thread/60919

Ви можете зберегти 16-розрядні ресурси як 8-розрядні за допомогою Preview.app

Як вирішити проблему "ПОМИЛКА ITMS-90682: Недійсний пакет - Каталог активів у" 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. Створіть файл .ipa, який можна перевірити. В Організаторі Xcode (Xcode-> Вікно-> Органайзер) виберіть архів для перевірки, натисніть «Експортувати ...» та виберіть «Експорт для розгортання на підприємстві або в режимі Ad-Hoc». Це створить локальну копію. ipa-файл для вашої програми.

  2. Знайдіть цей файл .ipa та змініть його розширення на .zip.

  3. Розгорніть файл .zip. Це створить папку корисного навантаження, що містить ваш набір .app.

  4. Відкрийте термінал і змініть робочий каталог на верхній рівень вашого шляху до CD-файлу .app / на / 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, або перемістити її до 9x.


2
Як це пов’язано з EXC_BAD_ACCESS?
animaonline

1
Будь ласка, не дублюйте відповіді. Натомість позначайте запитання як дублікати.
JAL

Дякую, чоловіче! Ви заощадили купу часу для мене цією відповіддю! )
Thorax

3
У моєму проекті (ціль розгортання 8,0) немає активів P3, я все ще отримую збій у програмі або випадково в будь-якому місці з xcode 8. Всі активи мають 8-біт / sRGB. Хто-небудь все ще стикався з цією ж проблемою
Ankit

@Ankit ми стикаємось з такою ж проблемою. Ви вже знайшли рішення?
Роман Труба

32

Сподіваюсь, цей скрипт bash може вам допомогти. Вхідний аргумент - каталог, який містить усі xcassets вашого проекту. Цей сценарій встановить для 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

спочатку працював, але потім ні, він просто не розбивається на тому ж місці
CiNN

1
Сценарій у мене не працював, але за допомогою ImageOptim так
deej

16

Мені вдалося відтворити проблему, і вона, здається, пов’язана із зображеннями в Каталозі активів. Виправлено помилку в Apple (із прикладеним зразком проекту)

Apple Bug Reporter: 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
Цей сценарій трохи точніший. Спасибо, Никита.
продає

1
Це працює як шарм. Простий, але ефективний сценарій. Для людей, які не знають, як запустити цей скрипт. Кроки: 1) Помістіть цей скрипт у файл txt та перейменуйте його на AssetsScript.sh 2) Перейдіть до папки, що додає Images.xcassets, і збережіть файл сценарію 3) У командному рядку перейдіть у папку, де існує ваш файл сценарію 4) Змініть дозволи на файли сценарію на виконуваний файл (chmod 755 AssetsScript.sh) 5) запустіть файл сценарію з параметром directoryName як параметром у самому командному рядку (./AssetsScript.sh Images.xcassets). Boom це перетворює всі ваші активи в необхідний формат і готово. Додаток тепер працює нормально.
Шріватса,

В один рядок, 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 на тому, що здавалося випадковим / навколо переходів Storyboard / навколо встановлення UIImage (ім'я ...) .. Знайдено цю тему: ( https://forums.developer.apple.com/thread/61643 )

Якщо ваш додаток націлений на iOS 8.4, він вийде з ладу на iOS 9.0 - 9.2 у Xcode 8 .. щось пов’язане з xcassets. Встановлення цілі розгортання на 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 всередині інформації про ваш проект та всі цілі однаковим.

У моєму випадку для мого Проекту було встановлено 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. Звільнитись
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.