美文网首页iOS随记iOS干货网络优化
UIWebview使用缓存并且保证实时性

UIWebview使用缓存并且保证实时性

作者: 篮之飞艾 | 来源:发表于2016-08-29 11:55 被阅读1671次

UIWebview使用缓存并且保证实时性

标签(空格分隔): iOS 缓存 UIWebview 实时更新


webview缓存策略的介绍

使用webview加载页面的时候,最理想的情况是: 资源文件没有更新,就只加载缓存文件。如果有更新,则第一时间使用新的文件。

UIWebview中提供的缓存策略

  • NSURLRequestUseProtocolCachePolicy 缓存策略定义在 web

协议实现中,用于请求特定的URL。是默认的URL缓存策略。

  • NSURLRequestReloadIgnoringLocalCacheData 从服务端获取数据,忽略本地缓存

  • NSURLRequestReloadIgnoringLocalAndRemoteCacheData //源文件注释中写到没有实现

  • NSURLRequestReloadIgnoringCacheData

被NSURLRequestReloadIgnoringLocalCacheData替换了

  • NSURLRequestReturnCacheDataElseLoad

已经存在的缓存数据用于请求返回,不管它的过期日期和已经存在了多久。如果没有请求对应的缓存数据,从数据源读取

  • NSURLRequestReturnCacheDataDontLoad

已经存在的缓存数据用于请求返回,不管它的过期日期和已经存在了多久。如果没有请求对应的缓存数据,不要去数据源读取,该请求被设置为失败,这种情况多用于离线模式

  • NSURLRequestReloadRevalidatingCacheData //源文件中写到没有实现

其中我觉得最接近理想状态的就是默认的缓存策略了-NSURLRequestUseProtocolCachePolicy。 这个缓存策略的缓存模式,经过探究,如下图所示:

默认缓存策略的流程图默认缓存策略的流程图

我们会遇到两个问题:

1.在“是否过期”这个判断的地方,倘若后端开发人员没有设置过期时间,那么将会导致立马过期,即使有缓存的情况下,都会无法加载资源。尽管服务器资源没有更新。

2.当网络差的时候,缓存已经过期,则向服务器发出询问是否有更新,通常返回304的状态码的情况比较多,返回304则又会使用缓存。而这种情况在网络差的时候,发出请求这个部分时间非常的耗时。也就容易造成白屏了。

application cache

这个是h5中用到的一个缓存方式。使用manifest配置文件,告知客户端哪些需要更新,哪些不需要更新。使用这种方式,需要枚举出所有需要缓存的配置文件,每次打开页面都要去请求配置文件是否有更新,如果配置文件有更新,则更新配置文件中列出的资源文件。

缺点:多个页面引用同一个js,将会缓存两份js文件。需要服务端配合

优点:快速的展现缓存的内容,后台去更新缓存,下次再打开该资源时将使用最新的。

自定义一种较为优的缓存策略

既可以快速的加载缓存的内容,又可以实时的更新。

跟application cache的方式差不多,快速加载缓存,后台去异步更新,但是没有它的缺点。不会缓存多份文件,不需要服务端配合,意味着不需要改变服务端的东西。客户端开发人员就可以搞定。成本很小。快速又节约流量。

自定义cache策略图自定义cache策略图

如上图所示,发出网络请求后,会优先加载本地的缓存内容。使得资源得以实施的加载,杜绝白屏现象。然后异步去更新缓存。

这里的缓存策略依赖于自己的设定,使用webview自带的缓存策略即可。然后根据 当前时间 - 上一次更新时间 > 设定更新间隔时间按 这个条件来选择是否更新。

这样做的好处是防止白屏,又能实时更新。

附上github demo的地址:demo地址

使用方法:

pod 'JWNetAutoCache'

在需要开启的时候调用

[JWCacheURLProtocol startListeningNetWorking];

使用结束后调用

[JWCacheURLProtocol cancelListeningNetWorking];

代码侵入性小。可以随时的移除。缓存还是使用原来系统的方式来进行存储。移除后无感知。

相关文章

网友评论

  • Hunter琼:第三中缓存策略 只适用于一些固定的h5界面 稍微有sso 单点什么的 不行 纯客户端做缓存 似乎不靠谱.
  • Hunter琼:application cache 缓存楼主有没有demo啥的 怎么知道不需要更新的资源,更新资源用什么东西承载 是用接口传过来什么css html吗 实现方案是什么呢??
  • 辉_行者孙:您好,文章中自定义的缓存策略我觉得有点问题 如果有缓存并且大于间隔时间的话 -->先加载缓存 --> 然后后台异步请求数据更新缓存 但是这个时候如果H5的内容已经更新 此时界面显示的还是之前的缓存(因为逻辑是先加载缓存),也就是没有实时展示最新的数据 只有在更新数据后第二次进入该界面,才能显示最新的数据 不知道我想的对吗:smiley:
    Hunter琼:这种情况 是怎么解决 ??
  • Yan青天:JW 你好,请问 NSURLRequestUseProtocolCachePolicy ,这个该怎么用啊,用了方法[NSURLRequest requestWithURL:webUrl NSURLRequestUseProtocolCachePolicy timeoutInterval:60]; 好像并不能看离线的东西,目前还是自己定义URLProtocol 做的拦截缓存处理,发现系统的提供的几个缓存枚举没什么用呢?
  • 李某lkb:是否要修改一下流程,一开始去看有无更新.有更新直接拿最新的.没更新的话就拿缓存.对了,你对图片这些资源和网页分开了没有,有时候只是网页更新了,图片没变?
    辉_行者孙:您好,问一下 查看H5网页内容是否更新是怎么实现的呢?谢谢
    篮之飞艾:如果一开始去看有无更新的话,那么就是系统的策略了。直接使用默认策略就好。 网页在加载图片的时候,也是load url的方式。同样也是适用这个逻辑的。
  • BDCode:你好JW 使用你的项目后 遇到 h5界面 搜索历史 及 价格排序 失效了。后台跟新轮播图片 但我这边没有更新。 代码是按照demo写的 请帮忙看下原因
    Yan青天:你搞定了没?朋友
    BDCode:@篮之飞艾 看了下你GitHub左下角没有配置邮箱 其他地方也没发现邮箱,原谅我的小白吧。也希望大神 能在左下角配置下自己邮箱 微博地址等信息 方便查找
    篮之飞艾:@BDCode 加我吧!给我发邮件!github上面有邮箱
  • 超人的披风:有些网页缓存后CSS样式加载不出来
    篮之飞艾:可以调试下看下css是否有下载下来。。或者是否有加载。。。

本文标题:UIWebview使用缓存并且保证实时性

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