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

iOS11基于WWDC17的WKWebView Cookie变化监听实现示例请求

我之前也踩过这个坑!光实现WKHTTPCookieStoreObserver协议方法根本没用——你得主动把控制器注册为CookieStore的观察者才行,不然系统不知道要通知谁。下面是完整的正确实现示例,帮你解决这个问题:

正确实现WKHTTPCookieStore监听Cookie变化

核心要点:

仅仅遵守协议还不够,必须主动注册观察者,并且在合适时机移除,避免内存泄漏。

完整代码示例

import UIKit
import WebKit

class ActivitiesViewController: UIViewController, WKHTTPCookieStoreObserver {
    // 持有WKWebView实例(如果是Storyboard创建,直接关联IBOutlet即可)
    private var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 1. 初始化WKWebView(Storyboard创建可跳过这部分)
        let webConfig = WKWebViewConfiguration()
        webView = WKWebView(frame: view.bounds, configuration: webConfig)
        view.addSubview(webView)
        
        // 2. 关键步骤:注册Cookie变化观察者
        let cookieStore = webView.configuration.websiteDataStore.httpCookieStore
        // 第二个参数指定回调执行队列,传.main确保可以直接更新UI
        cookieStore.addObserver(self, queue: .main)
        
        // 加载测试页面(触发Cookie变化的操作,比如登录、设置Cookie的JS)
        if let testUrl = URL(string: "https://www.example.com") {
            webView.load(URLRequest(url: testUrl))
        }
    }
    
    // MARK: - WKHTTPCookieStoreObserver 协议实现
    func cookiesDidChange(in cookieStore: WKHTTPCookieStore) {
        print("🎉 Cookie发生变化啦!")
        // 可选:获取当前所有Cookie详情
        cookieStore.getAllCookies { cookies in
            for cookie in cookies {
                print("Cookie: \(cookie.name) = \(cookie.value) | 域:\(cookie.domain)")
            }
        }
    }
    
    deinit {
        // 3. 销毁时移除观察者,避免内存泄漏
        webView?.configuration.websiteDataStore.httpCookieStore.removeObserver(self)
        print("ActivitiesViewController 已销毁")
    }
}

必看注意事项

  • 版本要求:该API仅支持iOS 11及以上,确保你的项目部署目标不低于iOS 11
  • 注册时机:必须在WKWebView的配置初始化完成后再注册观察者,比如viewDidLoad中,不要提前访问websiteDataStore
  • 队列选择:addObserver的queue参数建议传.main,因为回调中如果要更新UI,必须在主线程执行
  • 排查无触发情况:
    • 确认测试页面确实有Cookie变更操作(比如登录、JS设置Cookie)
    • 检查是否注册到了错误的WKHTTPCookieStore实例(比如误用了WKWebsiteDataStore.default()而非当前webView的store)
    • 确保没有在子线程进行Cookie操作(部分第三方库可能会导致回调延迟)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:33