'NSKeyedUnarchiveFromData' 不应用于取消存档,并将在未来的版本中删除

'NSKeyedUnarchiveFromData' should not be used to for un-archiving and will be removed in a future release

我在日志中收到一条消息说

'bundleNamePlaceholder'[8424:100146] [general] 'NSKeyedUnarchiveFromData' should not be used to for un-archiving and will be removed in a future release

我不清楚该消息,但我假设它可能与 CoreData 对象或其内容有关

有什么方法可以捕捉到是什么原因引发了这条消息,或者是什么原因导致的?

apple 将在某些时候删除 NSKeyedUnarchiveFromData,因为默认情况下它不安全。如果您在 coredata 中使用 NSKeyedUnarchiveFromData 存储可转换值,它将变得不可读。

https://www.kairadiagne.com/2020/01/13/nssecurecoding-and-transformable-properties-in-core-data.html

https://developer.apple.com/forums/thread/107533

要找出导致这些日志消息的原因,请尝试为

添加符号断点

+[NSKeyedUnarchiver unarchiveObjectWithData:],

+[NSKeyedUnarchiver unarchiveTopLevelObjectWithData:error:],以及

+[NSKeyedUnarchiver unarchiveObjectWithFile:]

这帮助我找到了罪魁祸首。

在我的例子中,问题在于在 CoreData 中使用 Transformable 类型来保存字符串数组。默认情况下,CoreData 使用 NSKeyedUnarchiver 而不是 NSSecureUnarchiveFromData 转换器。于是换变压器解决了这个问题。

通常这与 Core Data Transformable 属性有关,但在我的例子中,这也是由外部库引起的,该库使用 NSValueTransformer.valueTransformerNames 迭代运行时可用的所有值转换器 类。这也导致了日志中的相同错误,并且此处其他答案中给出的符号断点没有捕获到它们。因此,如果您找不到拥有此日志的原因,您可能还想在代码中搜索 NSValueTransformer 并检查某处是否存在类似问题。

对我来说,问题出在 GoogleAnalytics 框架上,多亏了@Lutz,我才得以解决。对于那些面临 GA 问题的人,请使用更新的 sdk,这个问题似乎已经解决 GA SDK