我需要在 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 (*) 实例 - 那么完成 block 会正常触发,但显然 WebViews 看不到 cookie;/有人遇到过这个吗?关于如何共享 cookie 的想法?
iOS: 11.2.6
最佳答案
经过进一步测试后,我设法找到了解决方案 - 尽管我不确定发生了什么。简而言之 - 在 WKWebView 实例化后,上面的 完成处理程序会触发 OK。
在我的例子中,我需要在登录后设置一些 cookie(因此不会显示 ATM 的网页 View )。所以调用 setCookie 只会在某处排队这些操作——当 Web 客户端被触发时它们会被刷新。如果有人可以链接文档 - 那太好了!
更新
由于这个问题仍然存在 - 我终于回到了这个问题上。我现在的解决方案是:
在钥匙串(keychain)中缓存 cookie 值(每次应用程序调用 HTTPCookieStore.setCookie - 这可能完成或不完成(这是问题所在)
当 HTTPCookieStore.setCookie{ } 完成 block 触发时(确认 cookie 确实已设置)我然后从钥匙串(keychain)中删除值,webview 现在负责 cookie 值的生命周期)
每次启动应用程序时,我都会检查 cookie 值是否缓存在钥匙串(keychain)中 -> 如果是,则 HTTPCookieStore.setCookie()
上面可以无限循环,直到实际打开 webview。
关于ios - 未调用 WKHTTPCookieStore.setCookie 完成处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49452968/