WKWebView 支持的缓存 策略机制

https://www.cnblogs.com/lxlx1798/articles/14259055.html

注册登录

梁飞宇

iOS关于WKWebView缓存总结

  近期公司楼下实体店的网络及其不稳定,经常有用户反馈App里的网页打开特别慢,进度条一直加载不完,体验很差,于是就有了webview缓存的需求,项目里使用的是WKWebView,而且苹果早就不提倡使用UIWebView了,这里也不做赘述了。

WKWebView 支持的缓存策略枚举

* 参见苹果官方文档

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)

{

    NSURLRequestUseProtocolCachePolicy =0,// 默认策略,具体的缓存逻辑和协议的声明有关,如果协议没有声明,不需要每次重新验证cache。NSURLRequestReloadIgnoringLocalCacheData =1,// 忽略本地缓存,直接从后台请求数据NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4,//  iOS 13 实现,忽略本地缓存数据、代理和其他中介的缓存,直接从后台请求数据NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData       

    NSURLRequestReturnCacheDataElseLoad =2,//// 优先从本地拿数据,且忽略请求生命时长和过期时间。但是如果没有本地cache,则请求源数据NSURLRequestReturnCacheDataDontLoad =3,//只从本地拿数据NSURLRequestReloadRevalidatingCacheData =5,// iOS 13才实现,从原始地址确认缓存数据的合法性后,缓存数据就可以使用,否则从原始地址加载。};

WKWebView使用缓存方式:

// 使用默认策略举例NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:self.urlString]

                                                              cachePolicy:NSURLRequestUseProtocolCachePolicy

                                                          timeoutInterval:20];

[_webView loadRequest:request];

我们需要注意一下NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4和NSURLRequestReloadRevalidatingCacheData = 5在iOS13之前并未实现该协议,所以如果使用该协议一定要注意系统版本判断。

官方文档说明:

WKWebView 默认的缓存策略 NSURLRequestUseProtocolCachePolicy = 0 

官方文档关于HTTP和HTTPS的NSURLRequestUseProtocolCachePolicy决策树如下图:

如果没有特殊需求,系统默认的缓存策略已经比较完善了。

官方文档对默认缓存策略的说明:如果缓存不存在,则向服务器发起请求;如果缓存存在,且缓存response头没有指明每次都必须校验资源更新,且缓存没有过期,则系统会直接返回缓存,不会发起请求;如果缓存过期了或者要求每次请求都必须校验资源更新,则发起一个校验资源的请求,如果(服务器返回)资源有更新则使用服务器返回的最新数据,如果没有更新则使用本地缓存。如果没有特殊需求,系统默认的缓存策略已经比较完善了。

客户端使用系统缓存

设置缓存策略,决定是否使用缓存(即使允许加载缓存,离线的时候,也只能显示页面,具体的数据缓存需要web端实现);

使用 NSURLProtocol 拦截js、css,图片资源,但这种方式有一个问题,NSURLProtocol使用了私有API,有审核被拒的风险,项目中暂不推荐使用;

同服务器进行交互(缓存过期处理,以及web资源更新)。

WKWebView默认缓存策略遵循HTTP缓存协议,客户端默认缓存行为实际上是由服务器控制的,客户端和服务器通过HTTP请求头和响应头中的缓存字段来交流,进而影响客户端的行为。下面几个相关的请求头和响应头需要知道:

Cache-Control:max-age=xxxx,指明缓存过期时间

在第一次请求到服务器资源的时候,服务器需要使用Cache-Control这个响应头来指定缓存策略,它的格式如下:Cache-Control:max-age=xxxx,这个头指明缓存过期的时间

Last-Modified/If-Modified-Since,标识资源最后修改时间

Last-Modified 是由服务器返回响应头,标识资源的最后修改时间.

If-Modified-Since 则由客户端发送,标识客户端所记录的,资源的最后修改时间。服务器接收到带有该请求头的请求时,会使用该时间与资源的最后修改时间进行对比,如果发现资源未被修改过,则直接返回HTTP 304而不返回包体,告诉客户端直接使用本地的缓存。否则响应完整的消息内容。

Etag/If-None-Match,标识资源是否更新

Etag 由服务器发送,告之当资源在服务器上的一个唯一标识符。

客户端请求时,如果发现资源过期(使用Cache-Control的max-age),发现资源具有Etag声明,这时请求服务器时则带上If-None-Match头,服务器收到后则与资源的标识进行对比,决定返回200或者304。

设置缓存策略代码:

// 默认缓存策略 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]

cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];

客户端WebView加载H5和服务器交互过程流程图:

WKWebView缓存沙盒路径:

WKWebView清除缓存

WKWebView,在iOS9以后提供了缓存管理类WKWebsiteDataStore,iOS9以前只能手动移除文件

WKWebsiteDataStore提供了API获取web缓存数据类型

[WKWebsiteDataStore allWebsiteDataTypes]; 

WKWebView支持的缓存类型:

/**

    清除WKWebView的缓存

    在磁盘缓存上。

    WKWebsiteDataTypeDiskCache,


    html离线Web应用程序缓存。

    WKWebsiteDataTypeOfflineWebApplicationCache,


    内存缓存。

    WKWebsiteDataTypeMemoryCache,


    本地存储。

    WKWebsiteDataTypeLocalStorage,


    Cookies

    WKWebsiteDataTypeCookies,


    会话存储

    WKWebsiteDataTypeSessionStorage,


    IndexedDB数据库。

    WKWebsiteDataTypeIndexedDBDatabases,


    查询数据库。

    WKWebsiteDataTypeWebSQLDatabases

    */

WKWebView 清除指定类型缓存:

NSSet *websiteDataTypes= [NSSet setWithArray:@[

                        WKWebsiteDataTypeDiskCache,

                        WKWebsiteDataTypeMemoryCache

                        ]];//清除所有的web信息//NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];

[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{

}];

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 问题描述 今天遇到一个问题,网页加载的页面,服务器数据提交更新了,但是 iOS 这边显示的还是老的内容。页面使用的...
    远方竹叶阅读 9,990评论 0 12
  • 概述 之前主要使用UIWebView进行页面的加载,但是UIWebView存在很多问题,在2020年已经被苹果正式...
    大菠萝_DABLO阅读 918评论 0 4
  • 在移动互联网时代,有大量的静态资源需要在移动客户端进行展示,这些静态资源占据了客户端的主要网络流量。iOS系统针对...
    飞到哪阅读 7,275评论 0 14
  • 转载自:https://mp.weixin.qq.com/s/jZ-6cfd5wW9B_bIBenG7Sw现在我们...
    手中的风信子阅读 433评论 0 0
  • APP 中有很多从服务器获取数据、资源的需求,为了节省流量、加快访问速度、离线使用等需求,就会使用到网络缓存。HT...
    莫云溪阅读 1,283评论 0 1