Xcode 13-RC出现NSKeyedUnarchiver validateAllowedClass警告是什么原因?
警告产生原因
- Xcode 13 + iOS 15 对
NSKeyedUnarchiver反序列化的安全校验规则做了升级,目的是降低非法反序列化带来的安全风险,该警告是规则升级后的适配提醒。 - 你在代码中调用反序列化方法时,仅给允许类集合配置了
NSDate、NSDictionary两个类,但反序列化NSDictionary结构时,系统需要同时解析字典的key,而你用到的字典key为NSString类型,该类未被包含在你配置的允许类集合中。 - 当前版本系统仍会临时放行
NSString这类plist内置安全类型,但苹果明确说明后续系统版本会直接拦截未显式声明的类的反序列化操作,所以提前抛出警告。
解决方法
找到项目中使用NSKeyedUnarchiver反序列化对应数据的代码位置,将NSString添加到允许类集合即可。
Objective-C 示例修改
修改前代码:
NSError *error = nil; NSSet *allowClasses = [NSSet setWithObjects:[NSDictionary class], [NSDate class], nil]; NSDictionary *result = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowClasses fromData:targetData error:&error];
修改后代码:
NSError *error = nil; // 新增NSString到允许类集合 NSSet *allowClasses = [NSSet setWithObjects:[NSDictionary class], [NSDate class], [NSString class], nil]; NSDictionary *result = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowClasses fromData:targetData error:&error];
Swift 示例修改
修改前代码:
let allowClasses: Set<AnyHashable> = [NSDictionary.self, NSDate.self] let result = try? NSKeyedUnarchiver.unarchivedObject(ofClasses: allowClasses, from: targetData)
修改后代码:
let allowClasses: Set<AnyHashable> = [NSDictionary.self, NSDate.self, NSString.self] let result = try? NSKeyedUnarchiver.unarchivedObject(ofClasses: allowClasses, from: targetData)
如果你的字典结构中还包含NSNumber、NSArray等其他类型的key或value,也需要同步将对应类添加到允许类集合中。
内容的提问来源于stack exchange,提问作者Eduardo Santi
相关产品推荐
相关产品推荐

