在某些OS版本中未调用WKHTTPCookieStore getAllCookies完成处理程序

时间:2019-04-08 01:31:11

标签: ios swift cookies wkwebview wkhttpcookiestore

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

WKWebsiteDataStore.default().httpCookieStore.getAllCookies { (cookies) in
            callInitializationService(cookies)
        }

在我们的测试中,它可以在iOS 11.3至12.2操作系统版本的所有可用测试设备中正常运行。

当前问题是生产应用程序的行为很奇怪,安装后活动指示器根本没有消失。我们发现根本原因是从未调用WKHTTPCookieStore.getAllCookies完成处理程序,因此它阻塞了UI。此问题主要在iOS 11.2.x OS版本中发现,但不确定是否会影响其他任何OS版本。即使重新启动应用程序也无法解决问题。

有人有没有遇到过这个问题?有解决此问题的解决方案/解决方法吗?

1 个答案:

答案 0 :(得分:1)

this change起,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) {}];  
}

我在hshamansky撰写的答案中找到了此解决方案here。看来原始作者提起了bug report,但看起来似乎从未解决过。苹果似乎很难重现该问题。