UIWebview对H5的缓存功能

很多开发同学都会有这样一个体会,在iOS的UIWebview中,第一次打开H5页面的时候,特别慢,这是因为首次打开H5页面,所有资源都要从服务器请求,所以很慢。二次刷新H5页面的时候,发现加载速度很快,这是因为UIWebview自身对H5做了缓存,但是退出UIWebview之后,再次进来加载h5还是很慢,如果我们想做到一次加载之后,后面都能够使用缓存加载,针对这个问题该如何处理呢?

UIWebview缓存主要是利用NSURLCache来实现内存缓存或者本地缓存。内存缓存的最大值是4M(410241024),本地缓存是20M。

1. NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:4*1024 * 1024 diskCapacity:0 diskPath:nil];

2. [NSURLCache setSharedURLCache:cache];

其中[NSURLCache setSharedURLCache:cache]是针对当前进程中的所有clients做的共享缓存。由于iOS中当前进程中只有一个app, 所以只要是当前app中UIWebview加载的H5页面,都是共享这个缓存空间的。

3.在加入上述功能之后,利用charles抓包,发现第一次加载H5页面时候,很多的css文件,在二次打开该页面的时候,charles没有抓到,这个也证明了,在将css等资源文件缓存之后,再次打开H5页面之后,UIWebview直接从NSURLCache中获取缓存的css等资源,不会再次发起请求。另外也可以在加载H5后,打印cache.currentMemoryUsage来查看对应的内存消耗情况,如果数字大于0,就说明缓存中已经存储H5内容了。

以上是在内存中缓存H5页面,这个策略有个问题,如果用户将进程杀掉,再次打开H5的时候,需要重新缓存。还有另外一种缓存策略,在本地缓存H5内容,主要是利用在NSURLCache子类中重写- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request方法。

另外说一下大家比较烦恼的UIWebview进度条,用下面方法可以获取进度:

监听私有通知WebProgressEstimatedProgressKey,在回调的notification的userInfo里有一个KeyWebProgressEstimatedProgressKey对应的value即为进度值。

UIWebView是iOS上对WebKit的封装,WebKit是渲染引擎,UIWebView是渲染引擎和JS引擎的组合。

WKWebView 有以下几大主要进步:

1.WebKit框架使用WKWebView来代替IOS的UIWebView和OSX的WebView,并且使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safari一样快。

2.将浏览器内核渲染进程提取出 App,由系统进行统一管理,这减少了相当一部分的性能损失。

3.js 可以直接使用已经事先注入 js runtime 的 js 接口给 Native 层传值,不必再通过苦逼的 iframe 制造页面刷新再解析自定义协议的奇怪方式。

4.支持高达 60 fps 的滚动刷新率,内置了手势探测。

后语:希望大家在阅读后顺便点赞,以示鼓励!坚持是一种信仰,专注是一种态度!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,552评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,255评论 4 61
  • 部队要搞科目演示了,需要一个男兵进行解说。 我成功地进行了两个下午的解说,最终被大训队的战友刷了下去。 过程简单明...
    父宇子阅读 300评论 6 1