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

11

我需要在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无法查看cookies; / 有人遇到过这种情况吗?还有其他分享cookies的想法吗?
iOS:11.2.6

3
另一个有趣的观察是,这个问题在模拟器上不会出现。 - Pawel Klapuch
这个问题在iOS 12上没有发生,但是另一个cookie问题在iOS 12上出现了。我讨厌WKWebView。 - fthdgn
如果该方法位于DispatchQueue.main.async / sync内部,则不会触发此回调。 - fthdgn
2个回答

5
经过进一步测试,我已经找到了解决方案——尽管我不确定发生了什么。简而言之,在WKWebView实例化后,上面的完成处理程序正常触发。
在我的情况下,我需要在登录后设置一些cookie(因此当前没有显示任何webview)。因此,调用setCookie只是将这些操作排队在某个地方——当Web客户端启动时它们会被刷新。如果有人可以链接文档,那就太好了!
更新
因为这个问题仍然存在,所以我最终回到了这个问题。我现在的解决方案是:
1. 在钥匙串中缓存cookie值(每次应用程序调用HTTPCookieStore.setCookie - 可能会完成或不完成(这是问题所在))
2. 当HTTPCookieStore.setCookie{}完成块触发(确认确实设置了cookie)时,我删除密钥串中的值,现在webview负责cookie值的生命周期)
3. 在每次启动应用程序时,我检查是否在钥匙串中缓存了cookie值->如果是,则HTTPCookieStore.setCookie()
以上可能会无限循环,直到webview实际打开为止。

嘿,我有一个类似的问题,但它与进程池无关 - 我不认为你必须为了使 cookie 正常工作而创建一个新的进程池(我没有必要这样做)。但是,在设备上,如果我第一次点击我的 webview,我的完成处理程序会返回,然后退出并再次点击,它会返回,然后退出并再次点击第三次或第四次或第五次,某个时候它停止返回并且永远不会再返回。我尝试在调用设置 cookie 之前实例化 wkwebview,并尝试在各个点设置 processpool,但到目前为止什么都没用 :( - Binya Koatz
嗨,@BinyaKoatz,我遇到了类似的问题。你找到解决办法了吗? - user3911483
这里有任何更新吗?我也遇到了同样的问题。即使在实例化wkwebview之前。 - Vall0n
同意。我这里也遇到了同样的问题。有更新或者已经提交了 Radar 吗? - Rafthecalf
嘿@user3911483、Vall0n和Rafthecalf-已经提交了一个radar,标记为“DUPLICATE OF 38857415”,并且是OPEN状态,所以他们知道这个问题存在,但还没有解决。我正在处理的项目被取消了,所以我停止了解决这个bug的方案,但我会继续更新radar!对长时间的无声表示抱歉! - Binya Koatz

1
我的问题是删除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()

重新加载Web视图,永远不要清除Cookies...你怎么说? - Muhammad Shauket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接