在某些操作系统版本中未调用 WKHTTPCookieStore getAllCookies 完成处理程序

Vin*_*eth 3 cookies ios swift wkwebview wkhttpcookiestore

我们的 iOS 应用程序从中读取 cookieWKHTTPCookieStore以调用初始化 web 服务。如果我们正在寻找的特定 cookie 不存在于 CookieStore 中,则将在 web 服务中传递空值并返回相关响应。由于这是一个初始化 API,我们在完成处理程序中调用 web 服务,如下所示,并通过添加活动指示器来阻止 UI,直到它给出成功或失败。

WKWebsiteDataStore.default().httpCookieStore.getAllCookies { (cookies) in
            callInitializationService(cookies)
        }
Run Code Online (Sandbox Code Playgroud)

在我们的测试中,它在从 iOS 11.3 到 12.2 的操作系统版本的所有可用测试设备中运行良好。

当前的问题是生产应用程序有一个奇怪的行为,即安装后活动指示器根本不关闭。我们发现根本原因WKHTTPCookieStore.getAllCookies是从未调用完成处理程序,因此它阻塞了 UI。该问题主要在 iOS 11.2.x 操作系统版本中观察到,但不确定它是否也会影响任何其他操作系统版本。即使重新启动应用程序也不能解决问题。

有没有人遇到过这个问题?任何解决方案/解决方法可用于解决此问题?

mog*_*ter 5

自此更改以来,WebKit 在WKWebsiteDataStore必要时才初始化,这导致了有时在应该初始化时未初始化的问题。只有 Apple 才能修复的错误的真正来源。在此之前,您可以欺骗系统WKWebsiteDataStore在您调用获取或设置 cookie 之后直接使用此变通方法进行初始化:

if (@available(iOS 11.0, *)) {  
        // This completion handler won't be called for certain flows without the workaround below.
        [webView.configuration.websiteDataStore.httpCookieStore setCookie:cookie  
                                                        completionHandler:^{  
            [webView loadRequest:request];  
        }];  

        // WORKAROUND: Force the creation of the datastore by calling a method on it.  
        [webView.configuration.websiteDataStore fetchDataRecordsOfTypes:[NSSet<NSString *> setWithObject:WKWebsiteDataTypeCookies]  
                                                      completionHandler:^(NSArray<WKWebsiteDataRecord *> *records) {}];  
}
Run Code Online (Sandbox Code Playgroud)

我发现这个解决方案在这里由hshamansky书面答复。看来原作者提交了一个错误报告,但它看起来并没有得到解决。苹果似乎很难重现这个问题。