未调用WKHTTPCookieStore.setCookie完成处理程序

时间:2018-03-23 15:15:29

标签: ios swift cookies webkit wkwebview

我需要在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

2 个答案:

答案 0 :(得分:4)

经过进一步测试后,我设法找到解决方案 - 虽然我不确定发生了什么。简而言之 - 在实例化WKWebView之后,完成处理程序上面会激活。

在我的情况下,我需要在登录后设置一些cookie(因此没有显示ATM的webview)。因此,调用setCookie只会将这些操作排在某处 - 当Web客户端被触发时它们会被刷新。如果有人可以链接文档 - 那就太棒了!

更新

因为这个问题仍然存在 - 我终于回到了这个问题。我现在的解决方案是:

  1. 在钥匙串中缓存cookie值(每次app调用HTTPCookieStore.setCookie时 - 可能完成与否(这是问题)

  2. 当HTTPCookieStore.setCookie {}完成块触发(确认cookie确实已设置)时,我将从keychain中删除该值,webview现在负责cookie值的生命周期)

  3. 在app的每次启动时,我都会检查cookie值是否缓存在keychain中 - >如果是这样的话HTTPCookieStore.setCookie()

  4. 上面可以无限​​循环UNTIL webview实际上是打开的。

答案 1 :(得分:0)

我的问题是删除Cookie来使用户退出应用程序。 getAllCookies()的完成处理程序未触发,因此对我来说有效的是强制webView重新加载,这将刷新队列并删除co​​okie。

webView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
    for cookie in cookies {
        if cookie.name == "authentication" {
            self.webView.configuration.websiteDataStore.httpCookieStore.delete(cookie)
        }
    }
}
webView.reload()