作家
登录

我是如何一步一步实现网页离线缓存的?

作者: 来源: 2017-11-29 12:04:29 阅读 我要评论

CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了


一个Hybrid APP,若何做离线缓存策略?也可以简单来说,你的APP只是一个壳,琅绫擎真正加载的内容是H5,如不雅优化加载内容的速度?

先懂得一下NSURLProtocol

这个办法是停止家在之后的调用,我们须要在这老将请求过来的数据进行缓存。如许我们本地就有了指定URL的返回数据。

大年夜面意思看它是一个协定,然则它其实是一个类,并且持续自NSObject。它的感化是处理特定URL协定的加载。它本身是一个抽象类,供给了应用特点URL筹划处理URL的基本构造。你可以本身创建NSURLProtocol的子类,来让本身的应用支撑自定义的协定或者URL筹划。

我是若何一步一步实现网页离线缓存的?

  1. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
  2.     [self.responseData appendData:data]; 
  3.     [self.client URLProtocol:self didLoadData:data]; 

应用法度榜样永远不须要直接实例化一个NSURLProtocol子类。当一个下载开端的时刻,体系创建一个合适的protoco对象来响应URL请求。你要做的就是本身定义一个你本身的protocol,然后在APP启动的时刻调用registerClass:,让体系知道你的协定。

如许,我们就完成了UIWebView的离线缓存。在这里我封装了一个 ZGUIWebViewCache 。感兴趣的可以看一下。

这里须要留意:你不克不及在watchOS 2以及更高版本中自定义URL scheme和协定。

为了支撑特定的自定义请求,你最好定义NSURLRequest 或者NSMutableURLRequest。让自定义的┞封些对象来实现请求,这里须要应用NSURLProtocol的propertyForKey:inRequest:和setProperty:forKey:inRequest,然后你可以自定义NSURLResponse类来模仿返回信息。

接下来就开端对UIWebView进行离线缓存处理。

UIWebView的离线缓存处理

起首,我们须要自定义一个NSURLProtocol的子类,并且在AppDelegate.m的

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
  2.     [NSURLProtocol registerClass:[ZGURLProtocol class]]; 
  3.     return YES; 

注册。接下来的所有操作就都是在我们自定义的ZGURLProtocol中操作了。先看一下registerClass的感化:

测验测验注册一个NSURLProtocol的子类,使其对 URL Loading System 可见。这里的URL Loading System就是一组类和协定,许可你的应用法度榜样拜访由URL产生的内容,比如请求、接收内容和Cache等。当URL Load System开端加载一个请求的时刻,每个注册的协定类都被依次去调用,以肯定是否可以用指定的请求去初始化它。起首被调用的办法是:

  1. + (BOOL)canInitWithRequest:(NSURLRequest *)request; 

在该办法琅绫擎进行缓存过滤,比如你想只缓存js,那么断定request的path的后缀,如不雅是js,就返回YES,不然返回NO。

如不雅返回YES,那么就相当于该请求被自定义的URLProtocol来处理,这里不克不及包管所有的注册的NSURLProtocol都能被处理到。如不雅你定义了多个NSProtocol子类,这些子类将会以相反的次序调用。也就是说如不雅你是如许写的:

  1. [NSURLProtocol registerClass:[ZGURLProtocol class]];  
  2. [NSURLProtocol registerClass:[ZProtocol class]]; 

那么最先履行的是ZProtocol,如不雅参initWithRequest:返回的为YES,则请求由ZProtocol进行处理,且不会再走ZGURLProtocol。如不雅ZProtocol的initWithRequest:返回的为NO,则请求持续向下传递由其他的NSURLProtocol子类处理。

一旦返回YES,那么请求将会由本身写的子类处理,起首会调用:

  1. + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request 

剩下的处理过程就和UIWebView缓存处理类似了。

这个是一个抽象的办法,子类必须对其实现。平日情况下,我们一般都是直接返回request,然则这里你也可以直接修改此request,包含header,hosts等。可以对指定request进行重定向操作。

在这里,我们只是将现有的request进行返回即可。

紧接着,便会开端请求:

  1. - (void)startLoading; 

该办法的感化就是开端请求protocol指定的请求。该办法也是protocol子类必须实现的办法。在这里所做的操作就是:

先断定是否有缓存数据,如不雅有,则本身创建NSURLResponse,然后精华存数据放入,并进行client的一些操作,然后返回;如不雅没有缓存数据,则新建一个NSURLConnection,然后发送请求。


  推荐阅读

  医生供不应求怎么办?印度创企利用 AI 重塑医疗保健系统

CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了在印度,大年夜量始创企业欲望将AI技巧应用于相干范畴以知足13.24亿人口的需求。这是一项巨大年夜的事业,对于美国和全球其他地区的医疗保健>>>详细阅读


本文标题:我是如何一步一步实现网页离线缓存的?

地址:http://www.17bianji.com/lsqh/39272.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)