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

问题描述 投票:1回答:1

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

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

在我们的测试中,它在OS版本从iOS 11.3到12.2的所有可用测试设备中均正常运行。

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

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

ios swift cookies wkwebview wkhttpcookiestore
1个回答
0
投票

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,但看起来似乎从未解决过。苹果似乎很难重现该问题。

© www.soinside.com 2019 - 2024. All rights reserved.