我需要在WKWebView实例之间共享cookie - 为此我使用单个WKWebViewConfiguration实例,然后用于初始化每个WKWebView。
为了做到这一点,我假设我必须使用共享的WKProcessPool,例如:
let websiteDataStore = WKWebsiteDataStore.default()
websiteDataStore.httpCookieStore.add(self)
let configuration = WKWebViewConfiguration()
configuration.websiteDataStore = websiteDataStore
configuration.processPool = WKProcessPool() /* !!! */
但是这样做会导致setCookie完成处理程序无法触发。
let cookieStore = self.webConfiguration.websiteDataStore.httpCookieStore
cookieStore.setCookie(cookie, completionHandler: {
})
如果我没有设置WKProcessPool(*)实例 - 那么完成块会很好,但显然WebViews看不到cookie; /有没有人遇到过这个?关于如何共享cookie的想法?
iOS:11.2.6
答案 0 :(得分:4)
经过进一步测试后,我设法找到解决方案 - 虽然我不确定发生了什么。简而言之 - 在实例化WKWebView之后,完成处理程序上面会激活。
在我的情况下,我需要在登录后设置一些cookie(因此没有显示ATM的webview)。因此,调用setCookie只会将这些操作排在某处 - 当Web客户端被触发时它们会被刷新。如果有人可以链接文档 - 那就太棒了!
因为这个问题仍然存在 - 我终于回到了这个问题。我现在的解决方案是:
在钥匙串中缓存cookie值(每次app调用HTTPCookieStore.setCookie时 - 可能完成与否(这是问题)
当HTTPCookieStore.setCookie {}完成块触发(确认cookie确实已设置)时,我将从keychain中删除该值,webview现在负责cookie值的生命周期)
在app的每次启动时,我都会检查cookie值是否缓存在keychain中 - >如果是这样的话HTTPCookieStore.setCookie()
上面可以无限循环UNTIL webview实际上是打开的。
答案 1 :(得分:0)
我的问题是删除Cookie来使用户退出应用程序。 getAllCookies()
的完成处理程序未触发,因此对我来说有效的是强制webView
重新加载,这将刷新队列并删除cookie。
webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
for cookie in cookies {
if cookie.name == "authentication" {
self.webView.configuration.websiteDataStore.httpCookieStore.delete(cookie)
}
}
}
webView.reload()