我创建了一个方法来将HTTPCookieStorage中的cookie设置为WKHTTPCookieStorage,因为看起来这个api是完全异步的所以我创建了一个异步方法来设置wkHTTPCookieStorage中的cookie。
func copyCookiesToWKStore(completion: @escaping () -> Void) {
if let httpCookies: [HTTPCookie] = self.httpCookieStorage.cookies {
print("updating wkCookies with httpCookies: \(httpCookies)")
func copyCookiesAsync(index: Int, cookieHandler: SDCookiesHandler?) {
if let cookieHandler = cookieHandler, index < httpCookies.count {
let cookie = httpCookies[index]
cookieHandler.wkCookieStore.setCookie(cookie, completionHandler: {
print("set cookie in Cookie Storage: \(cookie)")
DispatchQueue.main.async {
copyCookiesAsync(index: index + 1, cookieHandler: cookieHandler)
}
})
}
else {
completion()
}
}
weak var cookieHandler = self
copyCookiesAsync(index: 0, cookieHandler: cookieHandler)
} else {
completion()
}
}
然后在我们要加载webview.load
时同步并插入wkCookiesHandler.copyCookiesToWKStore { [weak self] in
if let weakSelf = self {
DispatchQueue.main.async {
weakSelf.webView.load(cookiesRequest)
}
} else {
print("self is null")
}
}
但是当webview调用decisionPolicyFor navigationAction方法时,此时WKCookieStorage中的cookie未完全同步。
我在一些帖子中读到WKProcessPool有自己的循环来同步cookie,并且重置它,导致cookie与wkwebview同步,但我发现我在现有的webview流程中,它会导致webview出现奇怪的文物。
有没有人开始使用WKCookieStorage api,如何在这个api中插入cookie,WKWebview可以看到。