stackoverflow.com/questions/48699000/...

ню цвета в своем двоичном хранилище базовых данных, используя трансформируемый атрибут, определяя класс атрибута как UIColor следующим образом:

#import "CoreDataEntity+CoreDataClass.h"
#import <UIKit/UIKit.h>


NS_ASSUME_NONNULL_BEGIN

@interface CoreDataEntity (CoreDataProperties)

+ (NSFetchRequest<CoreDataEntity *> *)fetchRequest;

@property (nullable, nonatomic, retain) UIColor *transformable;
@property (nullable, nonatomic, copy)   NSString *string;

@end

NS_ASSUME_NONNULL_END

В iOS 11 Beta это перестало работать с такой ошибкой:

NSUnderlyingException=value for key 'NS.objects' was of unexpected class 'UIColor'. Allowed classes are '{(\n    NSDecimalNumber,\n    NSData,\n    NSUUID,\n    NSNumber,\n    NSDate,\n    NSArray,\n    NSOrderedSet,\n    NSDictionaryMapNode,\n    NSString,\n    NSSet,\n    NSDictionary,\n    NSURL,\n    NSNull\n)}'.}";
    NSUnderlyingException = "Can't read binary data from file";
}

Мне удалось воспроизвести конкретную проблему в проекте XCode на GitHub (Должен быть запущен с XCode Beta дважды, чтобы получить ошибку).

В демонстрационном проекте тип хранилища контролируется NSPersistentStoreDescription и задает для него значение NSBinaryStoreType, что я делаю в AppDelegate в проекте exanple, и я добавляю объекты в приложение didFinishLaunchingWithOptions, в противном случае это стандартный шаблон из приложения iOS11 с основными данными. Плюс небольшая датаамодель и занятия.

Если вы запускаете проект дважды, то в первый раз он создает хранилище данных, и все в порядке. Во второй раз хранилище данных пытается открыть и вылетает приложение. Эта проблема, кажется, связана только с бинарными хранилищами данных, насколько я могу судить, если я использую хранилище данных с поддержкой SQL, оно работает. Тем не менее, мое приложение в дикой природе и использует двоичный файл.

Я сообщил об этом Apple как об ошибке и обратился за помощью на форумы разработчиков, но Apple не признала эту ошибку, и никакой помощи не последовало.

Я немного волнуюсь, поскольку приближается дата выхода iOS11, и у меня нет решения, мое приложение просто не будет работать в iOS11.

Я попытался изменить свойство на NSData и посмотреть, возможно ли просто разархивировать данные, но кажется, что они как-то хранятся внутри как UIColor, и база данных просто не открывается.

Кто-нибудь может увидеть обходной путь? У меня есть приложение в дикой природе, и, возможно, я выпускаю обновление для преобразования хранилищ данных, прежде чем iOS11 сможет работать для некоторых, но это не гарантирует, что все пользователи получат исправления, и они могут потерять свои данные.

РЕДАКТИРОВАТЬ 1: Радар номер: 33895450

РЕДАКТИРОВАТЬ 2: Просто мне пришло в голову, что это относится кЛюбые трансформируемый атрибут в основных данных, значения, поддерживаемые в сообщении об ошибке, являются только типами свойств по умолчанию.

РЕДАКТИРОВАТЬ 3: просто из любопытства я заполнил все поля для трансформируемого атрибута (это никогда не требовалось раньше). Я добавил «NSKeyedUnarchiveFromData» к значению преобразователя имени основного объекта данных, оно должно быть по умолчанию, но вы никогда не знаете. Нет эффекта. В любом случае, он должен использовать преобразователь значения, чтобы знать, что это UIColor. Я заполнил поле пользовательского класса, чтобы оно было UIColor, без эффекта.

Редактировать 5: Я заметил ранее, что UIColor теперь поддерживает NSSecureCoding, если безопасность каким-то образом будет проблемой, которую так или иначе упускают из виду в другом типе хранилища.

Изменить: Теперь, когда iOS выпущена, я использовал один из моих TSI для дальнейшего наращивания этого. Получу ли я их обратно, если мне придется использовать один, чтобы заставить их исправить свое программное обеспечение?

Изменить: Apple ответил мне на мой TSI, они сказали, что это расследуется, нет обходного пути, и ждать ошибки. Они возместили мой TSI, потому что они не могли помочь.

Редактировать 8: Та же проблема в macOS High Sierra, с NSColor вместо UIColor.

Apple до сих пор не дал мне никакого отзыва о моем фактическом отчете об ошибке.

Ответы на вопрос(2)

Ваш ответ на вопрос