ios - WKHTTPCookieStorage 的 setCookie 在关闭和打开 Web View 后不返回

标签 ios swift webkit nshttpcookie wkhttpcookiestore

我有下面的代码,可以将 cookie 从一般 HTTPCookieStorage 复制到我的 webview 的 cookie 存储中。复制所有 cookie 后,我加载 webview

    let webView = WKWebView(frame: containerView.bounds, configuration: WKWebViewConfiguration())
    webView.navigationDelegate = navigationDelegate
    containerView.addAndFillSubview(webView)
    guard let sharedCookies = HTTPCookieStorage.shared.cookies else {
        return
    }

    // For each cookie in the common store, set it in the WKWebView's store.
    for sharedCookie in sharedCookies {
        // Add a block to the dispatch group every time a cookie begins to be set in the WKWebView's store.
        wkSetCookieDispatchGroup.enter() 
        webView.configuration.websiteDataStore.httpCookieStore.setCookie(sharedCookie) {
           // Release a block from the dispatch group every time a cookie is successfully set in the WKWebView's store.
           wkSetCookieDispatchGroup.leave()
        }
    }

    // Wait for all the cookies to be successfully set (all blocks in the wkSetCookieDispatchGroup to be released)
    wkSetCookieDispatchGroup.notify(queue: .main) {
       // Load url in webView
    }

这段代码第一次运行时它会工作 - 所有 cookie 都已设置,setCookie 的完成处理程序被调用并通知调度组。

但是,在运行 n 次(通常为 3 或 4 次)关闭并打开此 Web View 后,setCookie 的完成处理程序通常会无限期地停止返回。存在一些竞争条件,因为如果我设置断点并在每次打开 Web View 时点击它们,这个问题就永远不会发生。发生一次后,设置断点有时会使其重新开始工作,有时则无济于事。

注意:这只发生在设备上。在模拟器上,这永远不会发生。

没有关于 setCookie 的 completionHandler 何时应该返回或不返回的文档,事实上这是一个竞争条件,当你有断点时通常不会发生,这使得它非常难以调试。

有没有人遇到过这种情况?有什么建议吗?我已经尝试在几个地方显式设置 WKProcessPool,但没有用。我尝试在创建配置之前和之后创建 Web View 。我尝试了很多东西,但还是迷路了

最佳答案

不确定这是否符合您的要求,但我遇到了同样的问题,发现我创建的每个 WKWebViewConfiguration 都使用了相同的 cookie 存储,以用于不同的 WKWebView。

因为我需要为我将使用的任何 wk webview 实例使用相同的 cookie,所以我最终做的是创建一个单例 WKWebViewConfiguration,它添加一次所需的 cookie,设置一个 WKProcessPool,然后返回一个副本。

我需要的每个不同的 wk webview 将在副本上设置其自定义配置,但不必与 cookie 存储交互。

在遇到同样的问题后似乎对我有用。

关于ios - WKHTTPCookieStorage 的 setCookie 在关闭和打开 Web View 后不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49562649/

相关文章:

ios - 对于键 setDefaultLabelText,此类不符合键值编码。

css - 如何使用 CSS3 自定义边框形状

ios - Apple 全局开发者关系证书颁发机构中级证书和 iOS

ios - 如何从firebase读取数据?

java - Appium - 弹出警报消息没有被关闭

ios - Facebook 不返回用户数据,swift

swift - 在 Swift 4 中使用索引进行映射/归约

objective-c - WebView 本地 CSS

html - CSS:全宽 Flex 列不会在 Webkit 上彼此堆叠

ios - 模拟 CKContainer 用于单元测试