【发布时间】:2018-02-10 19:06:52
【问题描述】:
我使用可转换属性将颜色存储在我的二进制核心数据存储中,将属性的类指定为 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";
}
I managed to replicate the specific problem in an XCode project on GitHub(必须使用 XCode Beta 运行两次才能得到错误)。
在演示项目中,商店类型由 NSPersistentStoreDescription 控制并将其设置为 NSBinaryStoreType,我在示例项目的 AppDelegate 中执行此操作,并在应用程序 didFinishLaunchingWithOptions 中添加对象,否则它是来自具有核心的 iOS11 应用程序的标准模板数据。加上一个小型数据模型和类。
如果您运行该项目两次,第一次创建数据存储时一切正常。第二次,数据存储区尝试打开应用程序并使应用程序崩溃。据我所知,这个问题似乎只与二进制数据存储有关,如果我使用 SQL 支持的数据存储,它就可以工作。但是,我的应用程序在野外并使用二进制文件。
我已将它作为一个错误报告给 Apple,并在开发者论坛上寻求帮助,但 Apple 并未承认该错误,也没有任何帮助。
随着 iOS11 发布日期的临近,我有点担心,我没有解决方案,我的应用程序无法在 iOS11 中运行。
我尝试将属性更改为 NSData 并查看是否可以取消归档数据,但它似乎仍以某种方式在内部存储为 UIColor 并且数据库无法打开。
任何人都可以看到解决方法吗?我有这个应用程序,并且可能会在 iOS11 对某些人有效之前推出更新以转换数据存储,但这并不能保证所有用户都能得到修复,他们可能会丢失数据。
编辑 1: 雷达编号:33895450
编辑 2: 我突然想到这适用于核心数据中的 any 可转换属性,错误消息中支持的值只是默认属性类型。
编辑 3: 出于好奇,我填写了可转换属性的所有字段(以前从未要求过)。 我在核心数据实体的值转换器名称中添加了“NSKeyedUnarchiveFromData”,它应该是默认值,但你永远不知道。没有效果。无论如何,它必须使用值转换器才能知道它是 UIColor。 我把自定义类字段填为UIColor,没有效果。
编辑 5:我之前注意到 UIColor 现在支持 NSSecureCoding,如果安全性是在其他类型的商店中以某种方式被忽略的问题。
编辑:现在 iOS 已经发布,我使用了我的一个 TSI 来进一步升级。如果我必须使用一个来让他们修复他们的软件,我可以让他们回来吗?
编辑:Apple 在我的 TSI 上回复了我,他们说正在调查中,没有解决方法,并等待该错误。他们退还了我的 TSI,因为他们无能为力。
编辑 8:macOS High Sierra 上的相同问题,使用 NSColor 而不是 UIColor。
Apple 仍然没有就我的实际错误报告给我任何反馈。
【问题讨论】:
-
你能把你的雷达号码贴在这里吗?
-
好的,我把它加到了问题的末尾
-
我可以重现这个,但我现在想不出解决方法。
-
是的。我认为最终 UIColor 被存储为 nsdata,核心数据处理编码,因为 uicolor 支持 NSCoding。我认为也许将属性设置为 NSData 可以让我对其进行解码,所以我很惊讶地看到它仍然无法打开商店,这意味着沿着这条线的某个地方,它打开了商店,知道它是一个 uicolor,然后停止了进度出于某种原因,甚至没有看课。
-
谢谢,当我看不到原因时,我想我有时会发疯,但是这个错误不可能存在,对吧?无论存储什么,您都应该可以选择对其进行解码
标签: objective-c xcode core-data ios11 macos-high-sierra