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

标签 ios swift cookies wkwebview wkhttpcookiestore

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

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

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

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

有没有人以前遇到过这个问题?是否有解决此问题的解决方案/解决方法?

最佳答案

自从this change , WebKit 直到必要时才会初始化 WKWebsiteDataStore ,这导致了它有时没有在应该初始化的时候初始化的问题。只有 Apple 才能修复错误的真正来源。在此之前,您可以在调用获取或设置 cookie 之后直接使用此解决方法来欺骗系统初始化 WKWebsiteDataStore:

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) {}];  
}

我找到了这个解决方案 here在 hshamansky 写的答案中。看来原作者提交了一个 bug report ,但它看起来并没有得到解决。 Apple 似乎难以重现该问题。

关于ios - 在某些操作系统版本中未调用 WKHTTPCookieStore getAllCookies 完成处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55565188/

相关文章:

ios - CALayers 从不称其为委托(delegate)的 drawLayer :inContext: even after [layer setNeedsDisplay] and [layer display]

ios - 如何判断您的应用程序是使用 iCloud 架构开发还是生产

ios - 滚动到 CollectionView 中的上一张/下一张图像时,正确计算颜色不透明度偏移以更改背景颜色?

android - 使用 HTTPUrlConnection 持久存储 Cookie

internet-explorer - 为子域设置了 cookie,但 IE 开发人员工具在根域中显示 cookie。我错过了什么?

objective-c - UITextField rightView "WhileEditing"问题

Jquery Mobile 页脚问题有时没有什么好处

ios - 如何在 Swift 中实现类似于抽象属性的计算属性?

swift - 从数据源方法中使用的完成 block /闭包返回值

asp.net - 让 ASP.NET Cookieless Session 和 JQuery AJAX 完美结合