CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了
一个Hybrid APP,若何做离线缓存策略?也可以简单来说,你的APP只是一个壳,琅绫擎真正加载的内容是H5,如不雅优化加载内容的速度?
先懂得一下NSURLProtocol
这个办法是停止家在之后的调用,我们须要在这老将请求过来的数据进行缓存。如许我们本地就有了指定URL的返回数据。
大年夜面意思看它是一个协定,然则它其实是一个类,并且持续自NSObject。它的感化是处理特定URL协定的加载。它本身是一个抽象类,供给了应用特点URL筹划处理URL的基本构造。你可以本身创建NSURLProtocol的子类,来让本身的应用支撑自定义的协定或者URL筹划。
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
- [self.responseData appendData:data];
- [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的
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- [NSURLProtocol registerClass:[ZGURLProtocol class]];
- return YES;
- }
注册。接下来的所有操作就都是在我们自定义的ZGURLProtocol中操作了。先看一下registerClass的感化:
测验测验注册一个NSURLProtocol的子类,使其对 URL Loading System 可见。这里的URL Loading System就是一组类和协定,许可你的应用法度榜样拜访由URL产生的内容,比如请求、接收内容和Cache等。当URL Load System开端加载一个请求的时刻,每个注册的协定类都被依次去调用,以肯定是否可以用指定的请求去初始化它。起首被调用的办法是:
- + (BOOL)canInitWithRequest:(NSURLRequest *)request;
在该办法琅绫擎进行缓存过滤,比如你想只缓存js,那么断定request的path的后缀,如不雅是js,就返回YES,不然返回NO。
如不雅返回YES,那么就相当于该请求被自定义的URLProtocol来处理,这里不克不及包管所有的注册的NSURLProtocol都能被处理到。如不雅你定义了多个NSProtocol子类,这些子类将会以相反的次序调用。也就是说如不雅你是如许写的:
- [NSURLProtocol registerClass:[ZGURLProtocol class]];
- [NSURLProtocol registerClass:[ZProtocol class]];
那么最先履行的是ZProtocol,如不雅参initWithRequest:返回的为YES,则请求由ZProtocol进行处理,且不会再走ZGURLProtocol。如不雅ZProtocol的initWithRequest:返回的为NO,则请求持续向下传递由其他的NSURLProtocol子类处理。
一旦返回YES,那么请求将会由本身写的子类处理,起首会调用:
- + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
剩下的处理过程就和UIWebView缓存处理类似了。
这个是一个抽象的办法,子类必须对其实现。平日情况下,我们一般都是直接返回request,然则这里你也可以直接修改此request,包含header,hosts等。可以对指定request进行重定向操作。
在这里,我们只是将现有的request进行返回即可。
紧接着,便会开端请求:
- - (void)startLoading;
该办法的感化就是开端请求protocol指定的请求。该办法也是protocol子类必须实现的办法。在这里所做的操作就是:
先断定是否有缓存数据,如不雅有,则本身创建NSURLResponse,然后精华存数据放入,并进行client的一些操作,然后返回;如不雅没有缓存数据,则新建一个NSURLConnection,然后发送请求。
推荐阅读
CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了在印度,大年夜量始创企业欲望将AI技巧应用于相干范畴以知足13.24亿人口的需求。这是一项巨大年夜的事业,对于美国和全球其他地区的医疗保健>>>详细阅读
本文标题:我是如何一步一步实现网页离线缓存的?
地址:http://www.17bianji.com/lsqh/39272.html
1/2 1