Иконки одного размера: решение проблемы «Неправильное использование Core Data API» и «Сбой команды CompileAssetCatalog с ненулевым кодом завершения/возврата»

Автор: Лев Бакланов. Перевод: SwiftBook.

17 ноября 2022

Убедитесь, что:

  • Масштаб ваших complication assets установлен на «Единый Размер», а не на «Индивидуальные Масштабы».
  • все значки настроены на «Единый Размер», будь это ваш основной AppIcon или альтернативный

Когда я впервые услышал о поддержке значков одного размера на WWDC22, я был взволнован. У меня была довольно хорошая настройка, чтобы генерировать изображения с помощью Affinity Designer и Быстрой Команды, но, возможно, и не стоило переживать.

Начальный размер

Первое, что я cделал, это использовал сборку архива и проверку размера, как это делал Антуан ван дер Ли, что дало мне данный отчет (я упростил его). Apple объясняет этот процесс в их руководстве по Уменьшению размера вашего приложения.

# iPhone 14 Pro

App + On Demand Resources size: 71,8 MB compressed, 82,4 MB uncompressed

App size: 71,8 MB compressed, 82,4 MB uncompressed

On Demand Resources size: Zero KB compressed, Zero KB uncompressed

 

# Watch Ultra

App + On Demand Resources size: 26,1 MB compressed, 32,2 MB uncompressed

App size: 26,1 MB compressed, 32,2 MB uncompressed


 

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

До сих пор у меня было:

  • один AppIcon в Assets.xcassets для iOS, со значками как для iOS, так и для watchOS (не могу вспомнить, почему…)
  • один AppIcon в Assets.xcassets для watchOS

Итак, первое, что я сделал, это:

  • получил единые Assets как для iOS, так и для watchOS (добавьте его в целевое приложение Watch): я создал новый «Heavy.xcassets» для всех активов, используемых для iOS (а вскоре и для других…), таким образом мои Assets.xcassets были бы ограничены активами, совместно используемыми всеми приложениями (для вещей, совместно используемых приложениями с расширениями, у меня есть другие каталоги). Это означает, что пока у меня был только AppIcon.
  • удалил AppIcon из Assets для целевого приложения Watch

Я опираюсь на Watch, чтобы убедиться, что изменение ничего не испортило.

Я создал новый архив и снова прошел через процесс экспорта архива для разработки с истончением приложения, чтобы посмотреть, что изменилось.

# iPhone 14 Pro

App + On Demand Resources size: 71,8 MB compressed, 82,4 MB uncompressed

App size: 71,8 MB compressed, 82,4 MB uncompressed

On Demand Resources size: Zero KB compressed, Zero KB uncompressed

 

# Watch Ultra

App + On Demand Resources size: 26,1 MB compressed, 32,2 MB uncompressed

App size: 26,1 MB compressed, 32,2 MB uncompressed

On Demand Resources size: Zero KB compressed, Zero KB uncompressed

 

Всё хорошо!

Переход на Единый Размер

Я пошёл дальше и выбрал Single Size

Я собрал свое приложение, и оно упало:

❌  Ошибка команды CompileAssetCatalog с ненулевым кодом завершения

Сообщение об ошибке не было таким уж запутанным: каким образом в этом участвуют Core Data?

AssetCatalogSimulatorAgent *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object 0x906e9858c73ac8ba <x-coredata://E0662F14-2CE1-4084-BCF3-D261022348C6/SimpleArtworkRenditionSpec/p82> persistent store is not reachable from this NSManagedObjectContext's coordinator'

*** First throw call stack:

(

​0   CoreFoundation                      0x00000001807a3b44 __exceptionPreprocess + 172

​1   libobjc.A.dylib                     0x000000018005c144 objc_exception_throw + 56

​2   CoreData                            0x00000001858739cc _PFRetainedObjectIDCore + 680

​3   CoreData                            0x000000018586a1e4 -[NSManagedObjectContext objectWithID:] + 424

​4   CoreThemeDefinition                 0x000000019d9b5b2c __34-[TDRenditionsDistiller _distill:]_block_invoke + 36

​5   CoreData                            0x0000000185871720 developerSubmittedBlockToNSManagedObjectContextPerform + 156

​6   …

)

2022-11-09 14:00:32.369 AssetCatalogSimulatorAgent[38516:518671] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object 0x906e9858e65ac95a <x-coredata://E0662F14-2CE1-4084-BCF3-D261022348C6/NamedColorRenditionSpec/p345> persistent store is not reachable from this NSManagedObjectContext's coordinator'

*** First throw call stack:

(…)

2022-11-09 14:00:32.369 AssetCatalogSimulatorAgent[38516:518675] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object 0x906e9858e5fac8ba <x-coredata://E0662F14-2CE1-4084-BCF3-D261022348C6/SimpleArtworkRenditionSpec/p324> persistent store is not reachable from this NSManagedObjectContext's coordinator'

*** First throw call stack:

(…)

2022-11-09 14:00:32.369 AssetCatalogSimulatorAgent[38516:518672] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object 0x906e9858c3dac8ba <x-coredata://E0662F14-2CE1-4084-BCF3-D261022348C6/SimpleArtworkRenditionSpec/p117> persistent store is not reachable from this NSManagedObjectContext's coordinator'

*** First throw call stack:

(…)

libc++abi: terminating with uncaught exception of type NSException

/* com.apple.actool.errors */

: error: ERROR: Identical key for two renditions

 

(E)Key

​element:   ​Grouped/Packed Images

​part:      ​Artwork Image

​value:     ​(null)

​identifier:​0

​dimension1:​0

​state:     ​(null)

​scale:     ​2

​idiom:   ​watch

​subtype:      ​0

​gamut:   ​sRGB

​target:   ​any

​sizeClassHorizontal:   ​universal

​sizeClassVertical:   ​universal

​graphicsFeatureSetClass:      ​GLES2,0

​memoryClass:      ​0

​target:    ​any

​appearance:      ​(null)

​localization:      ​(null)

​glyphWeight:​(null)

​tglypSize: ​(null)

​deployment:   ​any

Я застрял в этом месте примерно на месяц:

Кто-нибудь с приложением Watch переключился на значок приложения Единого Размера?

Что-то не так с моими Assets, и я не могу собрать свое приложение (я получаю непонятную/вводящую в заблуждение ошибку c Core Data)

— Арно Жубе (@sowenjub) 11 октября 2022 г.

У меня были более срочные дела, но с объявлением нового раунда «Спросите Apple» я решил дать ему еще один шанс, таким образом я бы мог подать запрос.

Немного покопавшись, я нашел виновника: Complications Assets.

Я переключился с «Individual Scales» на «Single Scale», обновил одну из иконок для Graphic Extra Large, 38 мм, и на этом все: ошибка сборки исчезла.

Я подумал, что все готово, и на этот раз попытался заархивировать приложение, а не просто собрать его: не удалось.

Для Graphic Extra Large я изменил ширину экрана Apple Watch с «Individual Widths» на «Any». В этот раз я получил новую ошибку.

❌ CoreData: API Misuse: Attempt to serialize store access on non-owning coordinator (PSC = 0x600003cb9110, store PSC = 0x0)

Результат

# iPhone 14 Pro

App + On Demand Resources size: 74,7 MB compressed, 85,3 MB uncompressed

App size: 74,7 MB compressed, 85,3 MB uncompressed

On Demand Resources size: Zero KB compressed, Zero KB uncompressed

 

# Watch Ultra

App + On Demand Resources size: 26 MB compressed, 32,2 MB uncompressed

App size: 26 MB compressed, 32,2 MB uncompressed

On Demand Resources size: Zero KB compressed, Zero KB uncompressed

74,7 МБ со сжатием в “Single Size” против 71,8 МБ со сжатием в “All Sizes”.

Это скорее разочаровывает как итог после стольких ожиданий и отладки! Но еще не все потеряно. В процессе я обнаружил, что мое приложение может весить намного меньше! Но это для другого поста ;)

Наконец-то мне удалось использовать новую опцию значка приложения Singe Size в Xcode, но мое приложение кажется тяжелее (74,7 МБ против 71,8 МБ для iPhone 14 Pro). Что бы вы сделали? — Арно Жубе (@sowenjub) 9 ноября 2022 г.

Опубликовано: Арно Жубе. Перевод и адаптация: SwiftBook.

Оригинал статьи

 

Содержание