iOS应用开发,使用WKWebView加载Web界面,对于频繁访问的Web页面,特别是移动端的Web应用,用户需要使用时快速加载出来,这就需要依赖缓存机制支持,在WKWebView中,缓存机制分为两种,内存缓存和磁盘缓存
以下WKWebView简称wk
内存缓存
内存缓存是WkWebView自带的缓存机制,可以在较短时间快速读取已缓存的资源文件,提高页面打开速度,内存方案主要使用
WKProcessPool
对象管理多个WKWebView实例的缓存池,其中每个WKWebView都有自己的缓存。当WKWebView打开网页,WKProcessPool对象查询自己管理的缓存是否有匹配的缓存,如果有,则立即读取缓存资源并渲染页面,提高性能和速度。
开启内存缓存
内存缓存是默认开启的,可以通过一下WKWebViewConfiguration
获取
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init];
WKProcessPool *processPool = config.processPool;
清理内存缓存
内存缓存会随着WK转移而释放,但是如果占用过多,可以手动清理
NSArray * types =@[WKWebsiteDataTypeMemoryCache,WKWebsiteDataTypeDiskCache]; // 9.0之后才有的
NSSet *websiteDataTypes = [NSSet setWithArray:types];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
}];
磁盘缓存
磁盘缓存是将Web资源文件缓存在设备本地磁盘,以便于下次访问可以更快读取,在WK中,缓存文件位于Library/Cache
目录,可以在设备本地进行读取和存储。磁盘缓存方案一般采用URL缓存存储机制,和H5缓存存储机制。
开启磁盘缓存
开启磁盘缓存需要使用,NSURLCache对象
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:2 * 1024 * 1024
diskCapacity:100 * 1024 * 1024
diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
清理磁盘缓存
[NSURLCache.sharedURLCache removeAllCachedResponses];
采用问答形式简述WK缓存策略
-
什么情况下会缓存数据
客户端第一次访问网络资源,如果响应头不包含(Expire、Cache-Control:max-age、Last-modifired等),那么不会缓存,下次直接发起请求。如果响应头包含了缓存控制字段,大多数情况下这些数据会被缓存,下次启访问的时候执行缓存逻辑判断 -
什么情况每次都需要校验资源更新
响应头包含cache-control:max-ahe
或者pragma:no-cache
响应头只有etag
字段,没有过期时间和修改时间 -
缓存过期时间多久
响应头中cache-control:max-age=1800;表示缓存过期时间30分钟
响应头Expire值表示过期时间(服务器时间)
响应头,如果没上述两个字段,但有last-modifired字段,则触发启发式缓存,缓存时间(date_value - last_modifired_value ) *0.1
-
资源校验更新的过程是怎样的
revalidated的指标有两个,last-modifired和etag,这两个字段位于响应头中,客户端每次发起都会将这两个指标回调给服务器,if-last-modifired对应last-modifired的值,if-no-macth对应etag的值,服务器进行对比,客户端最新资源返回304,服务器最新返回200和响应数据
wk缓存流程总结
- 是否有缓存,没有则直接发起请求。有则进行下一步。
是否Ahe-Control:no-cache 或 Pragma:no-cache 字段 - 是否有缓存,没有则直接发起请求。有则进行下一步。
是否每次都得进行资源更新校验(响应头是否有 Cache-Control:no-cache 或 Pragma:no-cache 字段),不需要则进入3,需要则进入4 - 缓存是否过期(响应头,Cache-Control:max-age、Expires、Last-Modified 启发式缓存),没过期则使用缓存,不发起请求。过期了则进入 4。
- 客户端发起资源更新校验请求(请求头,If-Modified-Since : Last-Modified值、If-None-Match : ETag值),如果资源没有更新,服务器返回 304,客户端使用缓存;如果资源有更新,服务器返回 200 和资源
网友评论