Иконки одного размера: решение проблемы «Неправильное использование Core Data API» и «Сбой команды CompileAssetCatalog с ненулевым кодом завершения/возврата»
Автор: Лев Бакланов. Перевод: SwiftBook.
Убедитесь, что:
- Масштаб ваших 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)
У меня были более срочные дела, но с объявлением нового раунда «Спросите 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.