美文网首页
29期_iOS_WKWebView的缓存机制

29期_iOS_WKWebView的缓存机制

作者: 萧修 | 来源:发表于2023-08-31 01:00 被阅读0次

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缓存流程总结

  1. 是否有缓存,没有则直接发起请求。有则进行下一步。
    是否Ahe-Control:no-cache 或 Pragma:no-cache 字段
  2. 是否有缓存,没有则直接发起请求。有则进行下一步。
    是否每次都得进行资源更新校验(响应头是否有 Cache-Control:no-cache 或 Pragma:no-cache 字段),不需要则进入3,需要则进入4
  3. 缓存是否过期(响应头,Cache-Control:max-age、Expires、Last-Modified 启发式缓存),没过期则使用缓存,不发起请求。过期了则进入 4。
  4. 客户端发起资源更新校验请求(请求头,If-Modified-Since : Last-Modified值、If-None-Match : ETag值),如果资源没有更新,服务器返回 304,客户端使用缓存;如果资源有更新,服务器返回 200 和资源

相关文章

网友评论

      本文标题:29期_iOS_WKWebView的缓存机制

      本文链接:https://www.haomeiwen.com/subject/unotmdtx.html