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增加了一个时间戳,这样实际上和百度小说的解决办法是一样的,每次进入页面时都不加载缓存并直接访问新页面





    推荐阅读