iOS下如何使用与WKWebView相同的会话ID发送URLRequest实现会话保活
问题背景
我在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
相关产品推荐
相关产品推荐

