在iOS 12中,NSKeyedArchiver的初始化程序init(forWritingWith:)已被弃用。Xcode 10建议使用新的初始化程序init(requiringSecureCoding:)来代替它。问题在于,该初始化程序仅设置NSCoder对象的requiresSecureCoding属性的值,而不设置将包含编码数据的NSMutableData对象。以下是苹果提供的用于编码CKRecord(CloudKit记录)元数据的原始代码:
let data = NSMutableData()
let coder = NSKeyedArchiver.init(forWritingWith: data)
coder.requiresSecureCoding = true
record.encodeSystemFields(with: coder)
coder.finishEncoding()
CKRecord类的encodeSystemFields方法需要一个NSKeyedArchiver对象(一个NSCoder子类),并将编码数据存储在与此对象关联的NSMutableData对象中。如果我将init(forWritingWith:)初始化器替换为init(requiringSecureCoding:)初始化器,则会获得一个NSKeyedArchiver对象,但是该对象未与任何NSMutableData对象相关联,因此我无法获得记录的元数据。我不确定如何完成代码以将NSKeyedArchiver对象生成的数据放入NSMutableData对象中。
-decodeValueOfObjCType:at:size: only defined for abstract class. Define -[NSKeyedArchiver decodeValueOfObjCType:at:size:]!
?例如:let copy = coder.decodeObject()
- David JamesNSKeyedArchiver
(仅进行编码)解码,而你应该使用NSKeyedUnarchiver
。如果你能分享更多的代码,可能会更容易指出问题所在。 - Itai Ferberlet copy = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(NSKeyedArchiver.archivedData(withRootObject:view, requiringSecureCoding:false))
- David James