CoreData崩溃错误Xcode 11 Beta,IOS 13 Beta

33
或设置为NSKeyedUnarchiveFromDataTransformerName,这导致应用程序加载时出现崩溃。请使用“NSSecureUnarchiveFromData”或其子类的转换器来替代。在某个时间点,当未指定值为nil时,Core Data将默认使用“NSSecureUnarchiveFromData”,并且包含不支持NSSecureCoding的类的可转换属性将变得无法读取。

2019年7月22日13:58:12.910460+0300 GoodWine[3738:792501] [错误] 错误原因: 应用程序中有一个或多个模型使用了带有未设置或设置为NSKeyedUnarchiveFromDataTransformerName的变换器名称的可转换属性。请改用“NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类。在某个时间点上,当未指定为nil时,Core Data将默认使用“NSSecureUnarchiveFromData”,并且包含不支持NSSecureCoding的类的可转换属性将变得无法读取。

CoreData: 错误: 应用程序中有一个或多个模型使用了带有未设置或设置为NSKeyedUnarchiveFromDataTransformerName的变换器名称的可转换属性。请改用“NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类。在某个时间点上,当未指定为nil时,Core Data将默认使用“NSSecureUnarchiveFromData”,并且包含不支持NSSecureCoding的类的可转换属性将变得无法读取。

2019年7月22日13:58:12.910595+0300 GoodWine[3738:792501] [错误] CoreData: 应用程序中有一个或多个模型使用了带有未设置或设置为NSKeyedUnarchiveFromDataTransformerName的变换器名称的可转换属性,这导致应用程序加载时出现崩溃。请改用“NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类来替代。

请更改为 "NSSecureUnarchiveFromData" 或 NSSecureUnarchiveFromDataTransformer 子类。Core Data 在未指定情况下将默认使用 "NSSecureUnarchiveFromData",并且包含不支持 NSSecureCoding 的类的可转换属性将变得不可读。

CoreData: 警告:实体 'SFMCKeyValueEntity' 上的属性'value'正在使用nil或不安全的 NSValueTransformer。请切换到使用 "NSSecureUnarchiveFromData" 或 NSSecureUnarchiveFromDataTransformer 子类。


5
最重要的信息是:请改用“NSSecureUnarchiveFromData”或“NSSecureUnarchiveFromDataTransformer”的子类,不要再使用原先的方法。 - vadian
1
没有找到任何信息。 - Александр Бардашевский
我刚遇到了这个错误,并找到了以下答案。当我检查实体属性时,我发现“类”属性在字段中的默认值为“全局命名空间”。我将其切换为“当前产品模块”,然后重新运行程序,错误消失了。我会继续关注它,如果错误再次出现,我会尝试下面的答案。 - SouthernYankee65
2个回答

42

我找到了这个解决方案。错误已经消失,看起来它可以工作。我还在继续测试。

对于所有可转换属性,在数据模型检查器面板中将“Transformer”设置为“NSSecureUnarchiveFromData”。

输入图像描述

编辑:

经过几天的测试后,我对之前的解决方案进行了一些补充。

如果更改后不删除应用程序,则之前的解决方案有效。否则,数据模型将无法识别并从头开始创建,丢失所有历史信息(在生产中这是不可接受的!!!)。

我采用的最终解决方案是根据这个 链接 将这些更改添加到一个新模型中,并实现迁移(链接中始终有描述)。

在这种情况下,警告只出现一次更新后就消失了。


1
我尝试按照你的建议操作:在我的Transformable属性中,我将转换器设置为NSSecureUnarchiveFromData,删除了应用程序,清理了项目并重新编译。我得到了一个新的错误,说类似于(无法重现,请参见下文)我的类没有采用所需的协议。由于似乎没有关于NSSecureUnarchiveFromData的文档,我将转换器切换回nil,删除了应用程序并清理了项目,此后,错误不再出现在日志中。非常奇怪... - Reinhard Männer
@ReinhardMänner 感谢您的信息,我也做了同样的事情,修复了所有问题。 - erotsppa
可以确认编辑后的解决方案,我不得不创建一个新的数据模型才能使其工作。 - Jared

9

我的解决方案是保留旧的默认转换器,以避免任何兼容性问题。问题可能会出现,因为默认(nil)转换器最终将被NSSecureUnarchiveFromData替换,我不确定之前持久化的值是否会被正确解码(它们由默认转换器编码,但在更新后将由NSSecureUnarchiveFromDataTransformer解码)。我已经为符合NSCoding开箱即用的NSDictionary、NSArray、NSSet基础类型的字段实现了一个明确的默认转换器:

@objc(DefaultTransformer)
class DefaultTransformer: ValueTransformer {
    override class func transformedValueClass() -> AnyClass {
        return NSData.self
    }

    override open func reverseTransformedValue(_ value: Any?) -> Any? {
        guard let value = value as? Data else {
            return nil
        }
        return NSKeyedUnarchiver.unarchiveObject(with: value)
    }

    override class func allowsReverseTransformation() -> Bool {
        return true
    }

    override func transformedValue(_ value: Any?) -> Any? {
        guard let value = value else {
            return nil
        }
        return NSKeyedArchiver.archivedData(withRootObject: value)
    }
}

针对符合NSCoding的我的特殊数据类型,我已经实现了特定的转换器,如下:

@objc(EmailTransformer)
class EmailTransformer: ValueTransformer {
    override class func transformedValueClass() -> AnyClass {
        return NSData.self
    }

    override open func reverseTransformedValue(_ value: Any?) -> Any? {
        guard let value = value as? Data else {
            return nil
        }
        return NSKeyedUnarchiver.unarchiveObject(with: value)
    }

    override class func allowsReverseTransformation() -> Bool {
        return true
    }

    override func transformedValue(_ value: Any?) -> Any? {
        guard let value = value as? [Email] else {
            return nil
        }
        return NSKeyedArchiver.archivedData(withRootObject: value)
    }
}

随后,我为可转换字段设置了这些转换器,因此明确选择了最安全的方式。该解决方案的优点是:您无需担心数据迁移,只需实现显式转换器并将它们设置为您已有的任何数据模型版本。


EmailTransformer 看起来和你的 DefaultTransformer 完全一样。这是有意为之吗? - Wizard of Kneup
@WizardofKneup 这有点不同。 - kas-kad
这有点像一个搜索游戏,但我现在已经找到了。 :-) - Wizard of Kneup
我认为这可能会引起未来的问题,因为错误消息在最后非常清楚地指出:“包含不支持NSSecureCoding的类的可转换属性将变得无法读取”。 - zath
在我的情况下,我存储NSData,它符合NSSecureCoding标准。因此我认为我是安全的。 - kas-kad
@kas-kad 是的,你可能是对的!我稍微误读了错误信息 :) 我以为他们在谈论变压器,而不是可转换属性本身。 - zath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接