我需要在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
解决方法
经过进一步测试后,我找到了解决方案 – 虽然我不确定发生了什么.简而言之 – 在实例化WKWebView之后,上面的完成处理程序会激活.
在我的情况下,我需要在登录后设置一些cookie(因此没有显示ATM的webview).因此,调用setCookie只会将这些操作排在某处 – 当Web客户端被触发时它们会被刷新.如果有人可以链接文档 – 这太棒了!
UPDATE
所以这个问题仍然存在 – 我终于回到了这个问题.我现在的解决方案是:
>在keychain中缓存cookie值(每次app调用HTTPCookieStore.setCookie时 – 可能完成与否(这是问题)
>当HTTPCookieStore.setCookie {}完成块触发(确认cookie确实已设置)时,我从keychain中删除值,webview现在负责cookie值的生命周期)
>在app的每次启动时,我都会检查cookie值是否缓存在keychain中 – >如果是这样HTTPCookieStore.setCookie()
以上可以无限循环UNTIL webview实际上是打开的.