【问题标题】:CoreData crash error Xcode 11 Beta, IOS 13 BetaCoreData 崩溃错误 Xcode 11 Beta, IOS 13 Beta
【发布时间】:2019-11-30 08:34:27
【问题描述】:

我正在尝试在手机 IOS 13 Beta 上从 Xcode11 Beta 构建我的应用程序。应用程序加载时我崩溃了。

2019-07-22 13:58:12.910460+0300 GoodWine[3738:792501] [错误] 故障: 此应用程序中的一个或多个模型正在使用可变形 具有未设置或设置为的转换器名称的属性 NSKeyedUnarchiveFromDataTransformerName。请切换到使用 “NSSecureUnarchiveFromData”或一个子类 NSSecureUnarchiveFromDataTransformer 代替。在某些时候,核心数据 当 nil 为时,将默认使用“NSSecureUnarchiveFromData” 指定的和可转换的属性,其中包含不 支持 NSSecureCoding 将变得不可读。

CoreData:故障:此应用程序中的一个或多个模型正在使用 具有未设置的转换器名称的可转换属性, 或设置为 NSKeyedUnarchiveFromDataTransformerName。请切换到 使用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 代替。在某些时候,核心数据 当 nil 为时,将默认使用“NSSecureUnarchiveFromData” 指定的和可转换的属性,其中包含不 支持 NSSecureCoding 将变得不可读。

2019-07-22 13:58:12.910595+0300 GoodWine[3738:792501] [错误] CoreData:此应用程序中的一个或多个模型正在使用 具有未设置的转换器名称的可转换属性, 或设置为 NSKeyedUnarchiveFromDataTransformerName。请切换到 使用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 代替。在某些时候,核心数据 当 nil 为时,将默认使用“NSSecureUnarchiveFromData” 指定的和可转换的属性,其中包含不 支持 NSSecureCoding 将变得不可读。

CoreData:警告:实体“SFMCKeyValueEntity”上的属性“值”是 使用 nil 或不安全的 NSValueTransformer。请切换到使用 “NSSecureUnarchiveFromData”或一个子类 NSSecureUnarchiveFromDataTransformer 代替。

【问题讨论】:

  • 最重要的信息是请改用“NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类
  • 没有找到任何信息 ( (
  • 我自己也遇到了这个错误,找到了下面的答案。当我检查实体属性时,我看到属性“类”在字段中有一个默认值“全局命名空间”。我将其切换为“当前产品模块”并重新运行程序,错误消失了。我会密切关注它,如果错误再次出现,我会尝试下面的答案。

标签: swift core-data core-data-migration xcode11 ios13


【解决方案1】:

我找到了这个解决方案。错误已经消失,它似乎工作。我一直在测试。

对于所有 Transformable 属性,我在 Data Model Inspector 面板中将“Transformer”设置为“NSSecureUnarchiveFromData”。

编辑:

经过几天的测试,我在之前的解决方案中添加了一些内容。

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

我采用的最终解决方案是将这些更改添加到新模型(遵循此 link)并实施迁移(始终在链接中描述)。

在这种情况下,警告仅在更新后出现一次,然后消失。

【讨论】:

  • 我尝试按照您的建议:在我的 Transformable 属性中,我设置为 Transformer NSSecureUnarchiveFromData,删除应用程序,清理项目并重新编译。我收到一个新错误,说(无法重现,见下文)我的班级没有采用所需的协议。由于NSSecureUnarchiveFromData 上似乎没有没有文档,我切换回将 Transformer 设置为 nil,删除了应用并清理了项目,从那时起,错误不再出现在日志。很奇怪……
  • @ReinhardMänner 感谢上帝的信息,做了完全相同的事情,修复了所有问题
  • 可以确认已编辑的解决方案,我必须创建一个新的数据模型才能使其工作。
【解决方案2】:

我的解决方案是保留旧的默认转换器以避免任何兼容性问题。由于默认(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 完全相同。这是故意的吗?
  • @WizardofKneup 有点不同
  • 这有点像搜索游戏,但我现在确实找到了。 :-)
  • 我相信这可能会导致将来出现问题,因为错误消息最后说:“包含不支持 NSSecureCoding 的类的可转换属性将变得不可读”
  • @zath 在我的情况下,我存储 NSData,它是 NSSecureCoding 兼容的。因此,我认为我是安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2019-12-15
  • 2019-11-28
  • 1970-01-01
  • 2016-10-20
  • 2015-11-19
  • 2015-06-07
相关资源
最近更新 更多