Swift CoreData崩溃错误Xcode 11测试版,IOS 13测试版

Swift CoreData崩溃错误Xcode 11测试版,IOS 13测试版,swift,core-data,core-data-migration,xcode11,ios13,Swift,Core Data,Core Data Migration,Xcode11,Ios13,我正在尝试在IOS 13 beta版手机上使用Xcode11 beta版构建我的应用程序。我在加载应用程序时崩溃了 2019-07-22 13:58:12.910460+0300 GoodWine[3738:792501][错误]故障: 此应用程序中的一个或多个模型正在使用transformable 具有未设置或设置为的转换器名称的属性 NSKeyedUnachivefromDataTransformerName。请切换到使用 “NSSecureUnarchiveFromData”或的子类 NS

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

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

CoreData:故障:此应用程序中的一个或多个模型正在使用 具有未设置的转换器名称的可转换属性, 或者从DataTransformerName设置为NSKeyedUnachiveFromDataTransformerName。请转到 使用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer。在某种程度上,核心数据 当为nil时,将默认使用“NSSecureUnarchiveFromData” 指定的,以及包含不包含 支持NSSecureCodeding将变得不可读

2019-07-22 13:58:12.910595+0300古德温[3738:792501][错误] CoreData:此应用程序中的一个或多个模型正在使用 具有未设置的转换器名称的可转换属性, 或者从DataTransformerName设置为NSKeyedUnachiveFromDataTransformerName。请转到 使用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer。在某种程度上,核心数据 当为nil时,将默认使用“NSSecureUnarchiveFromData” 指定的,以及包含不包含 支持NSSecureCodeding将变得不可读

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


我找到了这个解决办法。这些错误已经消失了,而且似乎可以正常工作。我一直在测试

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

编辑:

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

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

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


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

我的解决方案是保留旧的默认转换器,以避免任何兼容性问题。问题可能会出现,因为默认(nil)转换器最终将替换为NSSecureUnarchiveFromData,我不确定以前保存的值是否会正确解码(它们由默认转换器编码,但在更新后将由NSSecureUnarchiveFromDataTransformer解码)。我已经为NSCORDEX、NSCORE、NSSET基础类型的字段实现了一个显式的缺省转换器,它符合NSCORE的方框:

@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)
    }
}

之后,我为可转换字段设置了这些转换器,因此明确选择了最安全的方式。该解决方案的优点:您不需要为数据迁移而烦恼,只需实现显式转换器并将其设置为您已有的任何数据模型版本。

最重要的信息是,请改用“NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类。未找到任何信息((我自己刚刚遇到了这个错误,并找到了下面的答案。当我检查实体属性时,我看到属性“Class”在字段中有一个默认值“Global namespace”。我将其切换到“Current Product Module”并重新运行程序,错误消失了。我会密切关注它,如果错误再次出现,我会尝试回答下面的问题。我尝试按照您的建议进行操作:在我的可转换属性中,我将Transformer设置为Transformer
NSSecureUnarchiveFromData
,删除了应用程序,清理了项目,然后重新编译。我收到了一个新的错误,类似于(无法复制,请参见下文)我的类没有采用所需的协议。由于似乎没有关于
NSSecureUnarchiveFromData
的文档,我切换回将Transformer设置为
nil
,删除了应用程序并清理了项目,从那时起,错误不再出现在日志中。非常奇怪…@Reinhard Männer感谢上帝为您带来的混乱age,做了完全相同的事情,修复了所有可以在编辑的解决方案上确认的问题,我必须创建一个新的数据模型才能工作。EmailTransformer与您的DefaultTransformer完全相同。这是有意的吗?@WizardofKneup这是不同的一个bitit有点像搜索游戏,但我现在确实找到了它。:-)我相信这可能会在将来引起问题,因为错误消息最后说:“包含不支持NSSecureCodeding的类的可转换属性将变得不可读”@zath在我的情况下,我存储NSData,它符合NSSecureCodeding。因此我认为我是安全的。