UserDefaults中HttpCookie解归档失败问题求助
问题根源
解归档时指定的类型错误:你在getData方法中使用NSData.self作为解归档目标类,但实际归档的是[HTTPCookie]数组,类型不匹配直接导致解归档失败。
修复代码
修正解归档方法
针对数组类型的Cookie,需使用unarchivedObject(ofClasses:from:)方法,同时指定数组本身和元素的类:
func getData<T>(key: String) -> T? { let ud = UserDefaults.standard guard let val = ud.value(forKey: key) as? Data else { return nil } do { // 明确指定数组和Cookie类,适配数组类型的解归档 if let obj = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, HTTPCookie.self], from: val) as? T { return obj } return nil } catch { print("解归档失败: \(error.localizedDescription)") return nil } }
优化归档方法(可选)
增加类型约束,避免传入非可归档对象:
func setData<T: NSObject & NSCoding>(_ value: T, key: String) { let ud = UserDefaults.standard do { let archivedData = try NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: false) ud.set(archivedData, forKey: key) } catch { print("归档失败: \(error.localizedDescription)") } }
额外提示
HTTPCookie原生遵循NSCoding协议,支持直接归档,但数组类型必须在解归档时同时声明数组和元素类- 建议将Cookie获取时机调整到页面加载完成的
webView(_:didFinish:)方法中,避免在decidePolicyFor中过早触发导致Cookie未完全加载 - 若只需保存单个
HTTPCookie,可将解归档代码改为try NSKeyedUnarchiver.unarchivedObject(ofClass: HTTPCookie.self, from: val)
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

