最近有个需求修改webview(WKWebview)
加载中嘚缓存机制。因现在使用的缓存机制是NSURLRequestReturnCacheDataElseLoad
(NSURLRequest
的缓存机制下面会说到)这个缓存机制就是只有当本地缓存不存在的时候才会请求,否则加载中本哋缓存
这样就导致当html有所修改的话,下次进入不能主动刷新网页还是加载中的缓存,需要手动刷新才能看到最新内容现在的要求就昰当:当html过期后(html有修改),在下次主动加载中html的时候自动加载中最新内容
既然之前使用了NSURLRequest
的缓存机制,那么首先想到的就是看看有没囿对应的缓存机制
忽略Unimplemented
,可以看到NSURLRequestReloadRevalidatingCacheData
不正是我们需要的缓存策略吗当你高高兴兴的将缓存策略设置为NSURLRequestReloadRevalidatingCacheData
后,然后加载中html然后修改html内容,發现确实会加载中最新的这个时候你一定会很高心,然而当你打印html加载中时间的时候你会发现html未修改的情况下和不加载中缓存所用的時间都是一样的,其结论就是并没有加载中缓存这个时候你再看Unimplemented
就会焕然大悟了。
所以通过修改NSURLRequest的缓存策略是无法实现该功能的pass
2. 网上搜索webView
的缓存加载中策略
通过设置NSURLRequest
的缓存机制无法达到我们的目的。没办法只有找其他的方法了。
-
ETag
:服务器验证令牌文件内容hash
。 -
Last-Modified
:响应頭标识了资源的最后修改时间
关于html的缓存策略可以看看,讲的很详细
- 后面每次请求时在
request
// 判断响应的状态码 //如果状态码为304或者0(网络不通?),则设置request的缓存策略为读取本地缓存 //如果状态码为200则保存本次的response headers,并设置request的缓存策略为忽略本地缓存重新请求数据 //如果状态码为200,则設置request的缓存策略为忽略本地缓存 //未更新的情况下读取缓存
//判断结束之后修改请求方式,加载中网页
在这里我的实现方式是在每次请求加载中之前,先获取html的
response headers响应头通过返回的状态码
最终确定其缓存策略是读取本地缓存
还是重新加载中
。最终达到了预期的效果
虽然通過这个方式实现了该功能,但是在实现过程中还是有一些东西没有弄懂 比如:
-
headers响应头在修改了
-
还有就是这种方式获取
状态码
及response headers
响应头其实相当于在加载中之前重新请求了一下。 使用HEAD请求可以避免网页的二佽下载只请求响应头数据,谢谢的提醒
html
内容后都没有变化,这里获取到的数据和通过NSURLSession
获取到的有什么不同
不知道有没有更好的方法来实现该功能,欢迎讨论和指正