由于后台更新了一个网页,但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:NSURLRequestReloadIgnoringLocalCacheData
                                                           timeoutInterval: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:NSURLRequestReloadIgnoringLocalCacheData
                                                           timeoutInterval: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];

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

原文链接:https://www.jianshu.com/p/d11f9a49c408 MyBatis 二级缓存 关联刷新实现1、MyBatis缓存介绍2、二级缓存问题2.1、数据不一致问题验证2.2、问题处理思路3、关联缓存刷新实现 1、MyBatis缓存介绍      Mybatis提供对缓存的支持,但是在没有配置的默认情况下,它只开启一级缓存,二级缓存需要手动开启。      一级缓存只是相对于同一个SqlSession而言。也就是针对于同一事务,多次执行同一Mapper的相同查询方法,第一查询后,MyBatis会将查询结果放入缓存,在中间不涉及相应Mapper的数据更新(Insert,Update和Delete)操作的情况下,后续的查询将会从缓存中获取,而不会查询数据库。 功能包括: WKWebView的使用、JS和OC的交互、网页内容加载进度条的实现、WKWebView+UITableView混排 、 WKWebView离线缓存等。GitHub:https://github.com/wsl2ls/iOS_TipsiOS_Tips集合简介:1、暗黑模式2、AppleID登录应用3、AVFoundation 高仿微信相机拍摄和编辑4、AVFoundation 人脸检测5、AVFoundation 实时滤镜6、GPUImage框架的使用7、VideoToolBox和AudioToolBox音视频编解码8、OpenGL ES学习9、LeetCode算法练习10、键盘和UIMenuController的并存问题11、iOS Crash防护12、WKWebView相关 如果先断网,加载WKWebView后,页面出现空白;然后再连网,点击按钮后不刷新WKWebView,页面还是一片空白。 使用 [weakSelf.wkweb reload]; 方法刷新,急速切换网络会导致wkwebview刷新无效。 使用 [self.wkweb loadRequest: [NSURLRequest requestWithURL:[NSURL URLWithString:self.... 在开发过程中遇到前端改变图片文字,客户端没有实时刷新出来,抓包发现也没有请求网页相关接口。由于不懂后端的知识,折腾了很久,网上也查找了很多都说需要清除缓存。这是在网上查找的iOS9以上清除缓存方法NSArray * types = @[WKWebsiteDataTypeMemoryCache,WKWebsiteDataTypeDiskCache];NSSet*websiteDataTypes = ... ????????关注后回复“进群”,拉你进程序员交流群????????作者丨童红明来源丨百度App技术1. 前言从 WebView 开始加载一条请求,到页面完整呈现这一过程发生了什么?... 背景iOS的一个坑。在线上的版本中,iOS10系统中,app内使用WKWebView当作一个普通的子View来展示一个较长的Web内容组成一个hybrid页面时,会发生白屏的。经过原生端的开发的排除,确认是WKWebView的机制问题,并不是页面加载不完整或者是被劫持而导致的问题。为了更严谨的排出问题所在,我拉去了原声端的代码再次确认代码逻辑是否存在导致该问题所在的bug。因为该页面是一个自定义的... 首先来了解一下webview加载网页的几个模式,即websetting中设置的加载模式。websetting.setCacheMode( int  mode)。 LOAD_CACHE_ELSE_NETWORK:只要本地有, WKWebView的用法iOS如何调试Web代码2.1 iOS 模拟器调试web代码2.2 通过alert等相关方法2、获取WKWebView的准确高度2.1 通过注入JS代码2.2 通过KVO的方式3、WKWebView中Swift与JS交互3.1 基础知识3.1.1 WKScriptMessageHandler协议3.1.2 WKUserContentController3.1.3 WKScriptMessage3.2 JS调用Swift代码3.2 Swift调用JS iOS如何调试Web代码 WKWebView网页和js,css,png等资源文件都进行缓存。iOS8是采用清除js本地文件方法刷新缓存,iOS9及以后调用WKWebView清除缓存接口按照制定时间戳清楚缓存(由于是批量清除缓存可以用在用户登出清除数据,设置页面缓存数据清理)。最佳解决方案是js中对每一个网址,js,css,png等资源文件下载地址都加版本号,这样既利用了WKWebView缓存机制又实现了他们按照需要刷新。... var browserRule = /^.*((iPhone)|(iPad)|(Safari))+.*$/; //判断是否是苹果手机或iPad if (browserRule.test(navigator.userAgen... 一、Cookie不能同步和丢失首次加载页面的时候带不上 Cookie;Ajax 类型的请求带不上 Cookie;跳转页面时(status code 302) 带不上 Cookie;前端设置 document.cookie 不能及时被同步。解决方案首次加载的时候手动设置 request header field 'Cookie';通过 hook js document.cookie setter a...