我试图将我单独获取的会话cookie注入到WKWebview请求中,结果证明这是相当痛苦的......
我设法使用注入会话cookie这个解决方案 https://stackoverflow.com/questions/26573137/can-i-set-the-cookies-to-be-used-by-a-wkwebview/26577303#26577303, 如下:
// Acquiring the cookies
let cookies = HTTPCookie.cookies(withResponseHeaderFields: headers, for: s.request!.url!)
//Appending all the cookies into one raw string.
var cookiesRawString = ""
for c in cookies {
cookiesRawString += "\(c.name)=\(c.value); "
}
var req: URLRequest = try! URLRequest(url: URL, method: method)
// Then the injection itself
request.setValue(cookiesRawString, forHTTPHeaderField: "Cookie")
webView.load(req)
让我用伪代码快速解释一下服务器逻辑:
- 服务器接收对端点的调用/端点1附加初始会话 cookie
- 然后继续将客户端重定向到/端点2用户生成的令牌附加在 url 中。
- 请求附加令牌的第二个端点将导致最终重定向到/端点3带有包含一次性会话 cookie 的 Set-Cookie 标头
-
/端点3附加一次性会话 cookie 会导致 200 响应,并且用户被识别。
问题是,由于某种原因,当我使用上面的方法将 cookie 添加到初始请求时,会导致重定向循环,而在 Android 平台上它可以完美地工作(我在那里使用了类似的注入方法)。
我看到它们之间唯一的区别是 Android 应用程序注入了 cookie仅根据最初的请求,并且所有后续重定向调用都没有这些会话 cookie。
虽然ios在所有重定向调用上重复初始会话 cookie(甚至忽略服务器 set-cookie 标头并附加初始会话 cookie..)。
难道我做错了什么?如何使 wkwebview 仅在初始请求时使用注入的 cookie?
编辑1:也尝试回退到UIWebview,但它产生相同的结果,似乎将cookies作为标头注入不好,但我尝试使用HTTPCookieStorage,但它不会保存cookie!
// the count is 7
var cookiesCount = HTTPCookieStorage.shared.cookies(for: s.request!.url!)?.count
let cookies = HTTPCookie.cookies(withResponseHeaderFields: headers, for: s.request!.url!)
for c in cookies {
HTTPCookieStorage.shared.setCookie(c)
}
// Count is still 7!
cookiesCount = HTTPCookieStorage.shared.cookies(for: s.request!.url!)?.count
编辑2:
好吧,我发现 UIWebview 使用 cookie 存储的全局实例,与 alamofire 相同(我用它来获取会话 cookie),因此无需手动添加 cookie,该网站可以识别用户。
但我仍然更喜欢使用 WKWebview,因为 UIWebview 内存泄漏猛增(几个网页导航后超过 100 MB!)。
有没有办法在 WKWebview 中使用全局 cookie jar(由 alamofire 使用)?