hybird开发webview缓存机制

494 阅读1分钟

背景

最近在维护一个webview项目,客户端访问的url(index.html)是通过协议缓存(etag && last-modify)进行文件缓存的,但每次更新后,app访问的仍是缓存文件。
虽然最后发现是搞了个乌龙,发现老项目的静态资源(除了html外)都是使用强缓存且打包没有生成hash文件名,所以一直读取缓存;但也深入了解了app对webview的缓存机制(之前一直以为webview只是使用浏览器的缓存机制)。本文主要是记录下app对webview的缓存机制。

ios 缓存机制

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    NSURLRequestUseProtocolCachePolicy = 0,//默认遵守http缓存策略

    NSURLRequestReloadIgnoringLocalCacheData = 1, //忽略本地缓存
    NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented //忽略本地和远程缓存
    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,

    NSURLRequestReturnCacheDataElseLoad = 2,//只有当本地缓存不存在的时候才会请求,否则加载本地缓存
    NSURLRequestReturnCacheDataDontLoad = 3,//只加载本地缓存,没有缓存也不会请求

    NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented //判断缓存是否过期
};

ios一般使用NSURLRequestUseProtocolCachePolicy进行缓存;

android 缓存机制

Android WebView 的缓存模式有以下4种:

LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据。
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据。
LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
LOAD_CACHE_ELSE_NETWORK:只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

一般情况下(webview框架),安卓默认的方式是LOAD_DEFAULT, 没有网络情况下是LOAD_CACHE_ONLY;

参考文档

1 iOS webView缓存,保证加载最新html: juejin.cn/post/684490…
2 Android WebView的性能问题及缓存机制、资源加载方案: bbs.huaweicloud.com/blogs/detai…