一、前言
NSURLProtocol是iOS中URL Loading System的一部分。如果开发者自定义的一个NSURLProtocol并且注册到app中,那么在这个自定义的NSURLProtocol中我们可以拦截UIWebView,基于系统的NSURLConnection或者NSURLSession进行封装的网络请求,然后做到自定义的response返回。非常强大。
二、NSURLProtocol的使用流程
2.1、在AppDelegate中注册自定义的NSURLProtocol。
比如我这边自定义的NSURLProtocol叫做YXNSURLProtocol。
1 2 |
@interface YXNSURLProtocol : NSURLProtocol @end |
在系统加载的时候,把自定义的YXNSURLProtocol注册到URL加载系统中,这样 所有的URL请求都有机会进入我们自定义的YXNSURLProtocol进行拦截处理。
1 2 3 |
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [NSURLProtocol registerClass:[YXNSURLProtocol class]]; } |
加载完成后,当产生URL请求的同时,会依次进入NSURLProtocol的以下相关方法进行处理,下面我们依次来讲一下每一个方法的作用。
2.2、NSURLProtocol中的几个方法
2.2.1、是否进入自定义的NSURLProtocol加载器
1 2 3 4 5 6 7 8 |
+ (BOOL)canInitWithRequest:(NSURLRequest *)request{ BOOL intercept = YES; NSLog(@"YXNSURLProtocol==%@",request.URL.absoluteString); if (intercept) { } return intercept; } |
如果返回YES则进入该自定义加载器进行处理,如果返回NO则不进入该自定义选择器,使用系统默认行为进行处理。
如果这一步骤返回YES。则会进入2.3的方法中。
2.2.2、重新设置NSURLRequest的信息
1 2 3 |
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { return request; } |
在这个方法中,我们可以重新设置或者修改request的信息。比如请求重定向或者添加头部信息等等。如果没有特殊需求,直接返回request就可以了。但是因为这个方法在会在一次请求中被调用多次(暂时我也不知道什么原因为什么需要回调多洗),所以request重定向和添加头部信息也可以在开始加载中startLoading方法中重新设置。
2.2.3、这个方法主要是用来判断两个request是否相同,如果相同的话可以使用缓存数据,通常调用父类的实现即可
1 2 3 |
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b{ return [super requestIsCacheEquivalent:a toRequest:b]; } |
这个方法基本不常用。
2.2.4、被拦截的请求开始执行的地方
1 2 |
- (void)startLoading{ } |
这个函数使我们重点使用的函数。
2.2.5、结束加载URL请求
1 2 |
- (void)stopLoading{ } |
2.3、NSURLProtocolClient中的几个方法
上面的NSURLProtocol定义了一系列加载的流程。而在每一个流程中,我们作为使用者该如何使用URL加载系统,则是NSURLProtocolClient中几个方法该做的事情。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
@protocol NSURLProtocolClient 7035d559689225067-27">27 |
@protocol NSURLProtocolClient n进行封装的网络请求,然后做到自定义的response返回。非常强大。
二、NSURLProtocol的使用流程2.1、在AppDelegate中注册自定义的NSURLProtocol。比如我这边自定义的NSURLProtocol叫做YXNSURLProtocol。
在系统加载的时候,把自定义的YXNSURLProtocol注册到URL加载系统中,这样 所有的URL请求都有机会进入我们自定义的YXNSURLProtocol进行拦截处理。
加载完成后,当产生URL请求的同时,会依次进入NSURLProtocol的以下相关方法进行处理,下面我们依次来讲一下每一个方法的作用。 2.2、NSURLProtocol中的几个方法2.2.1、是否进入自定义的NSURLProtocol加载器
如果返回YES则进入该自定义加载器进行处理,如果返回NO则不进入该自定义选择器,使用系统默认行为进行处理。 如果这一步骤返回YES。则会进入2.3的方法中。 2.2.2、重新设置NSURLRequest的信息
在这个方法中,我们可以重新设置或者修改request的信息。比如请求重定向或者添加头部信息等等。如果没有特殊需求,直接返回request就可以了。但是因为这个方法在会在一次请求中被调用多次(暂时我也不知道什么原因为什么需要回调多洗),所以request重定向和添加头部信息也可以在开始加载中startLoading方法中重新设置。 2.2.3、这个方法主要是用来判断两个request是否相同,如果相同的话可以使用缓存数据,通常调用父类的实现即可
这个方法基本不常用。 2.2.4、被拦截的请求开始执行的地方
这个函数使我们重点使用的函数。 2.2.5、结束加载URL请求
2.3、NSURLProtocolClient中的几个方法上面的NSURLProtocol定义了一系列加载的流程。而在每一个流程中,我们作为使用者该如何使用URL加载系统,则是NSURLProtocolClient中几个方法该做的事情。
|