• 现象描述

由于后台更新了一个网页,但iOS这边显示的还是旧内容。此现象 —— 网页的缓存

  • WKWebView的缓存策略
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{NSURLRequestUseProtocolCachePolicy = 0, // 默认策略,具体的缓存逻辑和协议的声明有关,如果协议没有声明,不需要每次重新验证cache。NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地缓存,直接从后台请求数据NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, //  系统未实现,忽略本地缓存数据、代理和其他中介的缓存,直接从后台请求数据NSURLRequestReturnCacheDataElseLoad = 2, // // 优先从本地拿数据,且忽略请求生命时长和过期时间。但是如果没有本地cache,则请求源数据NSURLRequestReturnCacheDataDontLoad = 3,  //只从本地拿数据NSURLRequestReloadRevalidatingCacheData = 5, //  未实现 从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从原始地址加载。
};

这里我们需要注意的是 NSURLRequestReloadIgnoringLocalCacheData 和 NSURLRequestReturnCacheDataElseLoad
NSURLRequestReloadIgnoringLocalCacheData忽略缓存,直接取网络。
NSURLRequestReturnCacheDataElseLoad先读取缓存,没有缓存则取网络。

  • 获取网络最新数据

1、使用 NSURLRequestReloadIgnoringLocalCacheData 来实时加载网页

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.urlString] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];
[_webView loadRequest:request];

2、通过 NSHTTPURLResponse 中的 Last-Modified 或者 Etags 来判断当前html是否是最新的网页(此方法没有亲测)

  • Last-Modified

表示文件的最后修改时间,例如"Fri, 26 Oct 2018 03:17:23 GMT",当请求 html 时,我们会向服务器发送 If-Modified-Since 报头,查看文件是否被修改,如果没有被修改,则 HTTP 返回303状态码,如果会修改了返回200。

  • Etags

客户端通过 If-None-Match 这个条件判断请求来验证资源是否修改。服务器判断发送过来的 Etag 和计算出来的 Etag 匹配,因此 If-None-Match 为False,不返回200,返回304,客户端继续使用本地缓存。

具体可以看这篇HTTP缓存控制小结

先查看打印

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.urlString]cachePolicy:NSURLRequestReloadIgnoringLocalCacheDatatimeoutInterval:20];
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;NSLog(@"httpResponse == %@", httpResponse);}] resume];

可以看到

httpResponse == <NSHTTPURLResponse: 0x283bc9a40> { URL: ---} {
Status Code: 304,
Headers {Date =     ("Sat, 27 Oct 2018 01:19:36 GMT");Etag =     ("\"5bb086b4-2bd\"");"Last-Modified" =     ("Sun, 30 Sep 2018 08:17:56 GMT");Server =     (Tengine);
} }

想要的参数都在里面。

具体实现

_webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, WY_ScreenWidth, WY_ScreenHeight - WY_NavBar_H + WY_SAFE_TOP) configuration:configuration];_webView.navigationDelegate = self;NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.urlString]cachePolicy:NSURLRequestReloadIgnoringLocalCacheDatatimeoutInterval:20];NSDictionary *cachedHeaders = [[NSUserDefaults standardUserDefaults] objectForKey:self.urlString];//设置request headers (带上上次的请求头下面两参数一种就可以,也可以两个都带上)if (cachedHeaders) {NSString *etag = [cachedHeaders objectForKey:@"Etag"];if (etag) {[request setValue:etag forHTTPHeaderField:@"If-None-Match"];}NSString *lastModified = [cachedHeaders objectForKey:@"Last-Modified"];if (lastModified) {[request setValue:lastModified forHTTPHeaderField:@"If-Modified-Since"];}}[_webView loadRequest:request];[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;NSLog(@"httpResponse == %@", httpResponse);
// 根据statusCode设置缓存策略if (httpResponse.statusCode == 304 || httpResponse.statusCode == 0) {[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];} else {[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
// 保存当前的NSHTTPURLResponse[WY_UserDefaults setObject:httpResponse.allHeaderFields forKey:self.urlString];}
// 重新刷新dispatch_async(dispatch_get_main_queue(), ^{[_webView reload];});}] resume];

这样就达到了缓存的目的。

WKWebView 网页缓存和刷新相关推荐

  1. 解决混合APP中网页缓存引起刷新不及时问题

    由于移动端的webview自带网页缓存机制,所以经常出现H5和原生交互开发时,前端开发人员给移动端提供了一个固定的网址路径,让移动端调用加载,当前端开发人员已经重新上传了新的网页内容,移动端加载的仍是 ...

  2. CI框架 -- 网页缓存

    CodeIgniter 可以让你通过缓存页面来达到更好的性能. 尽管 CodeIgniter 已经相当高效了,但是网页中的动态内容.主机的内存 CPU 和数据库读取速度等因素直接影响了网页的加载速度. ...

  3. js app缓存自动刷新_如何通过清除缓存来刷新App Store中的内容

    js app缓存自动刷新 Are you finding that you're not seeing new apps on the App Store, or that updates to ap ...

  4. html cdn不缓存,【前端开发日常 - 6】七牛CDN上的网页缓存问题及HTML禁止缓存(续)...

    需求背景 紧接着之前的内容[前端开发日常 - 5]七牛CDN上的网页缓存问题及HTML禁止缓存. 由于七牛CDN无法通过设置对单独的文件修改,而只能通过对 bucket 的统一设置修改 max-age ...

  5. 安卓 微信网页缓存清除方法

    该清除 微信网页缓存 只在安卓中有效,ios微信多刷新几次页面即可清除缓存 1  http://debugx5.qq.com  微信中打开该链接 2  滑动到底部,如下图 3  勾选最后的四个小方框, ...

  6. 配置nginx网页缓存时间

    配置nginx网页缓存时间 当Nginx将网页数据返回给客户端后,可设置资源在客户端缓存的时间,以方便客户端在日后进行相同内容的请求时直接返回,以避免重复请求,加快了访问速度,一般针对静态网页进行设置 ...

  7. 深入剖析ISAServer 网页缓存及配置

    深入剖析ISAServer 网页缓存及配置<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:offic ...

  8. 实现网页中增加刷新按钮、链接的方法 搜集

    最近用到一个技术,实现在网页中添加"刷新"超链接的方法,在网上搜集了一些,但是都是按钮形式的,悲剧,经过尝试,发现稍加改动,放在超链接上效果甚好! 搜集: <input ty ...

  9. mybatis学习(46):二级缓存被刷新的情况

    目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; im ...

最新文章

  1. 中国人情世故的63个定律 。
  2. 信标组的磁标安装长度
  3. Paper:《Spatial Transformer Networks》的翻译与解读
  4. [分布式训练] 单机多卡的正确打开方式:Horovod
  5. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
  6. jmeter的安装和测试
  7. Castle ActiveRecord学习实践(1)入门
  8. latex longtable caption长度提前换行解决方案
  9. 精通css和css权威指南_CSS中的笔触文字:权威指南
  10. JDBC连接池连接超时失效问题
  11. 新手学堂之有刷/无刷动力电调与马达知识
  12. Neo4j ---windows下载安装neo4j
  13. Echarts教程_1-2 简介
  14. android远程控制电视,手机如何远程控制电视
  15. 用Python批量替换更改掉txt文本的内容
  16. 微信小程序中获取用户微信公众号授权(openid)用来发送模板消息
  17. java剪刀石头布小游戏_JAVA实现“剪刀石头布”小游戏
  18. (信贷风控七)申请评分卡模型Python实现(图文+代码实现)
  19. js跳转页面与打开新窗口的代码
  20. 使用SQLMAP自动化探测SQL注入

热门文章

  1. 【vue+百度地图】vue项目使用百度地图API(普通展示)
  2. 社区开通反馈投诉QQ、MSN、新的反馈邮件。
  3. 多项式展开式系数 (x平方+3x+1)的五次方展开中x平方系数是多少?
  4. 04-WIFI通讯服务端搭建
  5. 网页提交文件无法打开问题解决办法(以学习通为例)
  6. Css计算--calc()方法
  7. 基于framebuffer(fb)的驱动分析
  8. 弗朗兹·约瑟夫·海顿
  9. 获取工作簿下所有工作簿内每个工作表数据汇总到指定工作表
  10. 图片无损放大软件哪个好?快把这些软件收好