美文网首页iOS开发中填坑工具程序员
iOS11.3 WK清理缓存导致崩溃,踩坑

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

作者: f0b693d9893e | 来源:发表于2018-04-03 14:55 被阅读171次

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

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

    iOS9WK清理缓存代码

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

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

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

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

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

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

    清理缓存提取

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

    移除网页缓存(部分代码)

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

    官方文档

    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清理缓存导致崩溃,踩坑

        本文链接:https://www.haomeiwen.com/subject/tnwbcftx.html