WKWebView缓存的那点事

来源:互联网 发布:湖南道县事件知乎 编辑:程序博客网 时间:2024/05/07 10:34

WKWebView自从推出至今,一直有不断地吐槽伴随,诚然,WKWebView具有很多好处:速度更快、内存更少,但是它也有一些坑

通过这几天的研究,总结一下遇到的关于WKWebView缓存的一些事情


1、二级页面跳转时仍然不可设置缓存策略

用过UIWebView或WKWebView的朋友都知道,在loadRequest方法中的NSURLRequest对象,是可以设置缓存策略的,如

NSURLRequest * urlReuqest = [[NSURLRequest alloc]initWithURL:url cachePolicy:1 timeoutInterval:30.0f];        [_webView loadRequest:urlReuqest];
我们通过设置urlRequest的缓存策略为NSURLRequestReloadIgnoringLocalCacheData的操作,指定了接下来的请求必须从服务器端获取,不能加载本地缓存

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






0 0
原创粉丝点击