You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:27:03