【发布时间】:2016-10-21 13:19:19
【问题描述】:
我正在尝试将我单独获取的会话 cookie 注入到 WKWebview 请求中,结果证明这很痛苦......
我设法使用this solution 注入会话cookie,如下:
// 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)
让我用伪代码快速解释一下服务器逻辑:
- 服务器收到对端点 /endpoint1 的调用,并附加了初始会话 cookie
- 然后继续将客户端重定向到 /endpoint2,并在 url 中附加用户生成的令牌。
- 请求附加令牌的第二个端点会导致最终重定向到 /endpoint3,其中 Set-Cookie 标头包含一次会话 cookie
- /endpoint3 附加一次性会话 cookie 会导致 200 响应,并且用户被识别。
问题是,由于某种原因,当我使用上述方法将 cookie 附加到初始请求时,会导致重定向循环,而在 Android 平台上它可以完美运行(我在那里使用了类似的注入方法)。
我看到它们之间的唯一区别是 android 应用程序仅在初始请求时注入 cookie,并且所有后续重定向调用都没有这些会话 cookie。 虽然 ios 在所有重定向调用中重复初始会话 cookie(甚至忽略服务器 set-cookie 标头并附加初始会话 cookie..)。
我做错了吗?如何让 wkwebview 仅在初始请求时使用注入的 cookie?
编辑1:也尝试回退到UIWebview,但它产生相同的结果,似乎将cookie作为标头注入并不好,但我尝试使用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 使用)??
【问题讨论】:
标签: ios swift redirect cookies wkwebview