UIWebview对H5的缓存功能

作者: 简单的快乐着 | 来源:发表于2017-04-25 15:11 被阅读607次

    很多开发同学都会有这样一个体会,在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 的滚动刷新率,内置了手势探测。

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

    相关文章

      网友评论

        本文标题:UIWebview对H5的缓存功能

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