WKWebView缓存的那点事
WKWebView自从推出至今,一直有不断地吐槽伴随,诚然,WKWebView具有很多好处:速度更快、内存更少,但是它也有一些坑
通过这几天的研究,总结一下遇到的关于WKWebView缓存的一些事情
1、二级页面跳转时仍然不可设置缓存策略
用过UIWebView或WKWebView的朋友都知道,在loadRequest方法中的NSURLRequest对象,是可以设置缓存策略的,如
NSURLRequest * urlReuqest = [[NSURLRequest alloc]initWithURL:url cachePolicy:1 timeoutInterval:30.0f];
[_webView loadRequest:urlReuqest];
我们通过设置urlRequest的缓存策略为 NSURLRequestReloadIgnoringLocalCacheData的操作,指定了接下来的请求必须从服务器端获取,不能加载本地缓存
【WKWebView缓存的那点事】OK,然后我们执行了一个网页跳转,跳转到了一个新的链接,这时候,我们可以通过代理方法指定是否让UIWebView或WKWebView进行跳转
但是这时候!我们如果打印WebView的request成员变量的cachePolicy属性,会发现它变成了NSURLRequestUseProtocolCachePolicy!也就是变成了系统默认的缓存策略
这样会导致如果有一个静态页面,该静态页面进行了更改,这时候前台已经加载过的设备,除非清除掉全部缓存,否则一直不会加载出新的页面
这个问题如果由APP端进行更改的话,只能用清理全部页面缓存的方法解决,比如后台更新了页面,可以更新一个状态时前台执行清理缓存的方法,这样页面就会重新加载,出现修改后的页面
另一个解决办法是由服务器更改,我截取了一下百度小说访问后的response的header文件,发现这样一个字段
"Accept-Ranges" = bytes;
"Cache-Control" = "max-age=0";
Connection = "keep-alive";
"Content-Length" = 114;
"Content-Type" = "text/html";
Date = "Wed, 03 Aug 2016 08:00:23 GMT";
Etag = "\"579f13e2-72\"";
Expires = "Wed, 03 Aug 2016 08:00:23 GMT";
"Last-Modified" = "Mon, 01 Aug 2016 09:18:26 GMT";
Server = nginx;
百度小说的response的header中,包含了一个Expires字段,该字段和Date,也就是访问页面的时间相同,这样每一次进入小说这个页面的时候,实际上是告诉App端的WebView,缓存已经过期,需要重新加载了,所以每次进入小说页面的时候,都可以实时更新
我们也可以在Nginx服务器设置一个这样的模组,生成一个Expires字段,与访问时间同步,这样就可以略过WebView的缓存了
2.通过JS端增加参数
公司的大牛建议我使用这种办法,而且他不建议在APP端进行修改,所以我们访问了原网页,为跳转的window.href增加了一个时间戳,这样实际上和百度小说的解决办法是一样的,每次进入页面时都不加载缓存并直接访问新页面
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量