Ios 使用decodeObject(of:forKey:)对符合协议的对象进行解码

Ios 使用decodeObject(of:forKey:)对符合协议的对象进行解码,ios,swift,protocols,nssecurecoding,Ios,Swift,Protocols,Nssecurecoding,我有一个Objective-C协议,要求符合NSSecureCodeding: 我发现错误:“decodeObjectof:forKey:”在Swift:use-generic“decodeObjectOfClass_u2;:forKey:”中不可用 如果您不知道编码的对象的特定类别,是否有任何方法可以使用NSSecureCodeding?NSSecureCodeding的整个要点就是防止出现这种情况。如果您不知道要解码的类,那么攻击者可以诱使您解码到一个与您预期的用于称为替换攻击的给定方法的类

我有一个Objective-C协议,要求符合NSSecureCodeding:

我发现错误:“decodeObjectof:forKey:”在Swift:use-generic“decodeObjectOfClass_u2;:forKey:”中不可用

如果您不知道编码的对象的特定类别,是否有任何方法可以使用NSSecureCodeding?

NSSecureCodeding的整个要点就是防止出现这种情况。如果您不知道要解码的类,那么攻击者可以诱使您解码到一个与您预期的用于称为替换攻击的给定方法的类行为不同的类中。这是一种用来攻击系统的技术,而NSSecureCodeding的开发就是为了阻止它

即使不是这样,也不可能构造协议类型的对象。运行时无法知道为实例变量分配多少内存


为了遵守NSSecureCoding,您必须知道所有子对象的精确类。

我听说在不久的将来,在我刚刚观看的一次WWDC会话中,NSCoding将被弃用,取而代之的是NSSecureCoding。如果是真的,在这种情况下我能做什么?@JeffV这不是真的:没有人打算反对NSCoding。您可以在取消归档时禁用安全编码;最好的做法是,在可能的情况下,随着时间的推移,将此数据迁移到允许您在启用安全编码的情况下解码的方案中。您可以通过找到从外部将该类型信息传递给您的类型的方法来做到这一点;一种方法是重用unarchiver的allowedClasses列表中当前的内容进行解码。然后,有人可以请求解码类的对象:[.self,.self],forKey:。。。就像他们需要为NSArray和其他收藏品做的那样。如果解码您的类型的人能够指出他们期望的子对象类型,我可以给出一个更具说明性的例子。
@protocol MyProtocol <NSObject, NSSecureCoding>
…
@end
required init?(coder aDecoder: NSCoder) {

    if let childObject = aDecoder.decodeObject(of: MyProtocol.self, forKey: "childObject") {
        self. childObject = childObject
    } else {
        return nil
    }
}