我们的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版本。即使重新启动应用程序也无法解决问题。
有人有没有遇到过这个问题?有解决此问题的解决方案/解决方法吗?
答案 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,但看起来似乎从未解决过。苹果似乎很难重现该问题。