Xcode 13出现[NSKeyedUnarchiver validateAllowedClass:forKey:]警告如何解决
警告原因
你开启了NSKeyedUnarchiver的安全编码模式,要求必须显式声明允许反归档的类。你当前的允许列表仅包含NSDictionary和NSDate,但解码Codable类型时底层会自动用到NSString等其他基础类,触发了系统警告。
解决方法
提供两种可选方案:
- 方案1:补充允许反归档的类列表(兼容现有归档逻辑)
在fetchValue方法中创建NSKeyedUnarchiver实例后,新增一行代码补充所有需要用到的基础类即可,修改后的对应代码片段如下:
let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data) // 新增这行,可根据你实际用到的Codable属性对应的基础类调整列表内容 unarchiver.allowedClasses = [NSDictionary.self, NSDate.self, NSString.self, NSNumber.self, NSArray.self, NSURL.self] unarchiver.decodingFailurePolicy = .setErrorAndReturn
显式声明所有允许反归档的类后,警告就会消失。
- 方案2:直接使用原生Codable序列化工具(无历史兼容需求时推荐)
如果你不需要兼容旧版NSCoding生成的归档数据,可以完全抛弃NSKeyedArchiver/NSKeyedUnarchiver,直接用PropertyListEncoder/JSONEncoder序列化Codable模型,不仅代码更简洁,也不会触发安全编码相关的警告,示例实现如下:
保存方法:
func save<T: Encodable>(value: T, for key: String, on path: URL) throws { let url = path.appendingPathComponent(key, isDirectory: false) try ANFileManager.createDirectoryAtPath(path: url.deletingLastPathComponent()) let data = try PropertyListEncoder().encode(value) try data.write(to: url) }
读取方法:
func fetchValue<T: Decodable>(for key: String, from path: URL) throws -> T { let url = path.appendingPathComponent(key) let data = try Data(contentsOf: url) return try PropertyListDecoder().decode(T.self, from: data) }
内容的提问来源于stack exchange,提问作者the monk
相关产品推荐
相关产品推荐

