iOS缓存策略
碰见的问题是,客服反馈有一些图片没有及时更新导致自己没有抢到优惠,才注意到webview缓存相关的一些知识。后台配合做了一些修改,通过控制cache-control实现对不同的资源进行不同的缓存策略。现在做一下总结。
1.NSURLRequestUseProtocolCachePolicy
如果缓存数据不存在,则直接从源端加载数据;
否则,如果缓存响应中没有明确表示每次请求必须重新验证,则如果不是缓存过期,则会返回缓存数据;
如果缓存过期或需要重新验证,URL加载系统发送HEAD请求到源端,查看资源是否发生了变化,如果变化了则取出从始发源的数据。否则返回缓存。
缓存过期或者需要重新验证说明
对于过期或者需要重新验证说明的情况,可以通过HTTP中请求头和响应头判断
Cache-Control
第一次请求到资源时,服务器需要使用cache-Control这个响应头来指定缓存策略,格式如下:Cache-Control:max-age=xxx,指明缓存过期时间。
常量 |
意义 |
public |
指示响应可被任何缓存区缓存 |
private |
内容只缓存到私有缓存中(仅客户端可以缓存) |
no-cache |
必须和服务器端确认响应是否发生变化,如果没有就是用缓存,否则更新请求响应数据 |
no-store |
所有内容都不会被缓存到缓存或 Internet 临时文件中 |
must-revalidation |
如果缓存的内容失效,请求必须发送到服务器进行重新验证 |
max-age |
可以接收生存期不大于指定时间(以秒为单位)的响应 |
min-fresh |
可以接收响应时间小于当前时间加上指定时间的响应 |
max-stale |
可以接收超出超时期间的响应消息 |
其他头信息:
Last-Modified:请求资源最近修改时间;
Etags:请求资源标识符,用于动态生成没有Last-Modified的资源;
Vary:决定请求是否可以缓存
总结:
默认缓存策略:当客户端发起请求时,先检查本地是否缓存,如果有,再检查缓存是否过期(通过Cache-Control判断),没有过期直接使用缓存策略。如果过期,就发起请求给服务器。如果资源具有Last-Modified或者Etages声明,服务器就会对比资源Last-Modified和Etages,如果不同则返回新数据,否则返回304或者200,告诉客户端使用本地缓存,304表示资源未更新。这个过程中,客户端发送请求主要取决于max-age是否过期,过期后就重新发送请求,服务端根据情况通知客户端是否可以继续使用缓存。
2.NSURLRueuestReloadIgnoringLocalCacheData
设置默认忽略缓存。
但是其效果并不会完全忽略。
使用下方法清除缓存可从侧面解决该问题。
NSSet *webSite = [WKWebsiteDataStore allwebsiteDataTypes];
NSDate *dateFrom = [NSDate datewithTimeIntervalSince1970:0];
[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:webSite modifiedSince:datefrom completionHandler:^{}];