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

iOS下如何使用与WKWebView相同的会话ID发送URLRequest实现会话保活

WKWebView会话Cookie同步问题解决

问题背景

我在App中使用WKWebView供用户登录我的服务端,同时有一个后台可调用的接口用于续期会话时长,调用该接口的请求需要携带与WKWebView一致的会话Cookie。

失效方案复盘

方案1:直接发起URLRequest

我最初认为Cookie由HTTPCookieStorage统一管理,因此直接使用如下代码发起请求:

var request = URLRequest(url: URL(string: DOMAIN + PAGE_KEEP_ALIVE)!)
let task = URLSession.shared.dataTask(with: request)
task.resume()

该方案未生效,服务端可以看到所有当前会话的失效时间并未更新。

方案2:手动从HTTPCookieStorage取Cookie拼接请求头

之后我尝试手动将Cookie添加到请求头中,代码如下:

let cookies = HTTPCookieStorage.shared.cookies(for: URL(string: DOMAIN)!)
let headers = HTTPCookie.requestHeaderFields(with: cookies!)
var request = URLRequest(url: URL(string: DOMAIN + PAGE_KEEP_ALIVE)!)
request.allHTTPHeaderFields = headers
let task = URLSession.shared.dataTask(with: request)
task.resume()

依然没有生效,后续追加设置request.httpShouldHandleCookies = true也没有解决问题。

可行解决方案

核心逻辑

iOS 8之后推出的WKWebView独立管理Cookie,不会同步到系统全局的HTTPCookieStorage,必须从WKWebView自身的Cookie存储实例中获取对应域名的Cookie,再手动拼接到请求头中。

最终实现代码

let store = webView.configuration.websiteDataStore.httpCookieStore
store.getAllCookies { cookies in
    let domainCookies = cookies.filter { c in c.domain == DOMAIN }
    let headers = HTTPCookie.requestHeaderFields(with: domainCookies)
    var request = URLRequest(url: URL(string: DOMAIN + PAGE_KEEP_ALIVE)!)
    request.allHTTPHeaderFields = headers
    let task = URLSession.shared.webSocketTask(with: request)
    task.resume()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:45:03