iOS11.3 WK清理缓存导致崩溃,踩坑

昨天马上就要下班了,测试拿着她的苹果手机,给我演示了点击清楚缓存多次App会闪退。这是线上的bug。WTF!!!怎么可能,之前都是好的。

没办法,赶紧打开代码调试,发现走到下图的位置,程序不定时闪退,而且次数很多。

iOS9WK清理缓存代码

完蛋了,这个方法是粑粑提供的,点进去也只能看到头文件

移除指定日期所有的网页缓存

这可如何是好,而且之前都是好的。百度了半天也没有一个人解释,在我锲而不舍的努力下,终于看到一篇文章链接在这里iOS11.3 WKWebView清除cookie所踩的坑!

该文中主要针对 苹果在iOS11.3上修改了nonPersistentDataStore创建的DataStore的实现 做了分析解释,nonPersistentDataStore在iOS11.3苹果对其做了修改,当然这也是作者的猜测。可是我的错误原因和这位写的不一样。但是,通过这篇文章开拓了我的思路。

经过对代码的研究,发现这个问题,如图

iOS9以后移除缓存,这种方式不能在子线程上进行,只能在主线程,而我之前清除缓存代码就是在子线程上进行的。之前的考虑是,计算缓存和清除缓存是耗时操作,在子线程做并加loading。清理完成回调主线程移除loading,此过程如下图

iOS11.3 WK清理缓存导致崩溃,踩坑_第1张图片
清理缓存提取

[self removeWebCache]这个方法就是调用下图方法。之前移除是在异步block块里执行的

iOS11.3 WK清理缓存导致崩溃,踩坑_第2张图片
移除网页缓存(部分代码)

在iOS11.3之前是没问题的,iOS11.3上会崩溃。所以猜测是iOS11.3苹果可能对网页cookies的线程安全问题做了修改,上图中的紫色提示,有个?号,点进去如下图

iOS11.3 WK清理缓存导致崩溃,踩坑_第3张图片
iOS11.3 WK清理缓存导致崩溃,踩坑_第4张图片
官方文档

Long-running tasks such as networking are often executed in the background, and provide a completion handler to signal completion. Attempting to read or update the UI from a completion handler may cause problems.

对于这段话的翻译:长时间运行的任务,比如网络通常是在后台执行,并提供一个完成处理器完成信号。试图从完成读取或更新UI处理程序可能会引起麻烦。

所以猜测是苹果在iOS11.3修改了关于WKWebsiteDataStore的处理。所以WK清理缓存还是放到主线程执行,之前没问题是幸运,是有隐患的。关于wkwebview的所有原生操作最好都放到主线程,webkit的线程会定时去主线程获取任务的!所以webkit进程和APP的主线程通信是有保证的!其他情况则会有风险!改到主线程应该就没有问题了!这个也耗不了多少性能。

踩坑完毕!总结下来,还是自己代码写的不够完善,还有苹果粑粑突然的修改导致这次bug的出现。不过以上都是根据现象的反推,不是100%确定,但是也解决了自己的bug,如果有大牛更清楚这块,请多指教,感激不尽!

你可能感兴趣的:(iOS11.3 WK清理缓存导致崩溃,踩坑)