iOS的web缓存相关

如题所述

第1个回答  2022-07-24

最近关于web界面偶有反馈拉到旧的界面,导致出现一些异常情况;
因此,对web资源的加载、缓存进行一些梳理。

以某个web界面加载为例,当我们不使用浏览器缓存时,返回的response是完整的html文本,同时还附带着ETag;

如果打开缓存策略,则请求头带了If-None-Match(对应直接的ETag: "5e58f3dd-b0b"),此时回包体积明显变小,同时返回码是304;

当请求或者response带有no-cache、max-age=0时,缓存的资源仍可使用,但是会通过请求进行验证,类似上面的ETag,返回 304表示Not Modified ,可以继续使用;( no-cache,并非放弃缓存

而当max-age=3600时,表示资源有效时间是1个小时,在有效时间内不需要通过后端验证,此时不需要发起网络请求,会直接由cache返回数据。(前提是客户端的request的header,没有设置no-cache和max-age=0)

一个资源的请求流程:

关于request和response的总结:

在前面的client->cache->server基础上,web缓存SDK所在的层级是在cache和server之间;
cache属于浏览器自身的缓存,web缓存SDK相当于代理,阻断了浏览器发起的网络请求,如果本地有匹配的数据,则使用本地数据返回,如果没有使用网络请求,最终所有的数据都会加载到cache;
web缓存SDK和上面的缓存策略并没有关系,上面的缓存策略决定是否要发起网络请求去验证资源、加载资源,而web缓存SDK则是在请求发起之后直接返回,类似charles的map local;

线上的web界面出现一个bug,web的同学修复完之后,手动刷新了cdn的资源和业务缓存SDK的资源。
但是部分html配置的no-cache失效(设置了max-age=xxx),导致如果之前进入过在拉到之前,会使用浏览器缓存;导致本次启动会一直使用旧的的界面。
解决方案:
1、更换该界面的url,使得cache失效;
2、清除webKit的缓存;

HTTP协议的学问博大精深,这次借此对缓存相关知识进行一次梳理。
参考链接
https://stackoverflow.com/questions/27105094/how-to-remove-cache-in-wkwebview