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

如何处理已废弃的unarchiveObject(with:)函数?SwiftKeychainWrapper适配问题

解决NSKeyedUnarchiver废弃方法的替换问题

你在使用SwiftKeychainWrapper时遇到的这个废弃警告很常见,iOS 12之后苹果确实弃用了unarchiveObject(with:),推荐使用带错误处理和类型校验的新方法。先提一下你尝试版本里的小问题:直接用try!会忽略所有错误,一旦解归档失败就会导致崩溃,这在生产环境里风险很高。

正确的实现方式

这里有两种更安全的方案,你可以根据实际需求选择:

方案1:使用unarchivedObject(ofClass:from:)(指定具体类)

如果明确知道要解归档的对象类型(比如自定义的NSCoding子类、NSString、NSNumber等),用这个方法做严格的类型校验会更稳妥:

open func object(forKey key: String, withAccessibility accessibility: KeychainItemAccessibility? = nil) -> NSCoding? {
    guard let keychainData = data(forKey: key, withAccessibility: accessibility) else { return nil }
    
    do {
        // 建议替换成你实际存储的具体类,比如YourCustomModel.self
        let result = try NSKeyedUnarchiver.unarchivedObject(ofClass: NSCoding.self, from: keychainData)
        return result
    } catch {
        print("解归档失败: \(error.localizedDescription)")
        return nil
    }
}

注意:NSCoding是协议,直接用它可能会触发警告,最好替换成你实际存储的具体类,这样能提前发现类型不匹配的问题。

方案2:使用unarchiveTopLevelObjectWithData(兼容多类型场景)

如果你的Keychain中可能存储多种NSCoding类型的对象,这个方法会更灵活,同时也要正确处理错误:

open func object(forKey key: String, withAccessibility accessibility: KeychainItemAccessibility? = nil) -> NSCoding? {
    guard let keychainData = data(forKey: key, withAccessibility: accessibility) else { return nil }
    
    do {
        let result = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(keychainData) as? NSCoding
        return result
    } catch {
        print("解归档失败: \(error.localizedDescription)")
        return nil
    }
}

这个方法会返回归档的顶级对象,再转成NSCoding类型,相比你之前的版本,把try!换成do-catch处理错误,避免了崩溃风险。

关键注意点

  • 永远不要用try!忽略错误:解归档失败可能因为数据损坏、模型版本不兼容等原因,必须处理错误(至少用try?转成nil,或者用do-catch打印错误日志排查问题)。
  • 尽量指定具体类:如果能确定存储的对象类型,优先用unarchivedObject(ofClass:from:),类型校验更严格。
  • 如果是Swift自定义类,要确保类遵循NSCoding协议,并且正确实现init?(coder:)和encode(with:)方法。

内容的提问来源于stack exchange,提问作者Roman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:09:11