【发布时间】:2018-12-01 03:06:48
【问题描述】:
我正在拼命尝试将自定义 cookie 添加到 WKWebView 实例(不使用 Javascript 或类似的解决方法)。
从 iOS 11 及更高版本开始,Apple 提供了一个 API 来执行此操作:WKWebViews WKWebsiteDataStore 有一个属性 httpCookieStore。
这是我的(示例)代码:
import UIKit
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
override func viewDidLoad() {
webView = WKWebView()
view.addSubview(webView)
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let cookie = HTTPCookie(properties: [
HTTPCookiePropertyKey.domain : "google.com",
HTTPCookiePropertyKey.path : "/",
HTTPCookiePropertyKey.secure : true,
HTTPCookiePropertyKey.name : "someCookieKey",
HTTPCookiePropertyKey.value : "someCookieValue"])!
let cookieStore = webView.configuration.websiteDataStore.httpCookieStore
cookieStore.setCookie(cookie) {
DispatchQueue.main.async {
self.webView.load(URLRequest(url: URL(string: "https://google.com")!))
}
}
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
webView.frame = view.bounds
}
}
在此之后,如果我使用 webView.configuration.websiteDataStore.httpCookieStore.getAllCookies(completionHandler:),我会看到我的 cookie 在 cookie 列表中。
但是,当使用 Safari 的开发人员工具(当然是使用 iOS 模拟器)检查 webview 时,cookie 不会显示。
我还尝试使用 HTTP 代理(在我的例子中是 Charles)检查流量,以查看我的 HTTP 请求中是否包含 cookie。不是。
我在这里做错了什么?如何将 cookie 添加到 WKWebView(在 iOS 版本 11 及更高版本上)?
【问题讨论】:
-
别以为你能做到。 Safaris 有自己的数据存储。因此,cookie、本地存储...不会在您的 webview 实例和 Safari 之间共享。这就是你在 Sarafi 看不到它们的原因
-
请再次阅读我的问题。我正在将 Safaris 调试器附加到我的 WKWebView。
-
啊,我的错。无论如何,您设置了 cookie,但没有将 cookie 与 URLRequest 对象一起发送。你应该做类似 urlRequest.setValue("someCookieKey = someCookieValue", forHTTPHeaderField: "Cookie")
-
我为什么需要这样做?如果设置了 cookie,它应该包含在 WKWebView 发出的任何请求中。如果不是,那老实说就是一个障碍。虽然我可以像您展示的那样为初始请求设置标头,但我无法为任何后续(ajax)请求设置标头,从而破坏了 cookie 的目的。
-
啊,好问题,如果你想让它自动附加cookie,只需
urlRequest. HTTPShouldHandleCookies = true
标签: ios cookies wkwebview wkhttpcookiestore