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

UserDefaults中HttpCookie解归档失败问题求助

WKWebView Cookie归档与解归档失败修复

问题根源

解归档时指定的类型错误:你在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:59:58