+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
if ([request.URL.absoluteString containsString:@"localhost"]) {
//看看是否已经处理过了,防止无限循环
if ([NSURLProtocol propertyForKey:kBZURLProtocolKey inRequest:request]) {
return NO;
}
return YES;
}
return NO;
}
将请求通过下面的方法,进行重新组装,设置成我们自己的请求
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
将上面组装好的请求,通过下面的方法发出。并在这里将发出的请求,进行标记,因为会重走流程,避免循环处理
- (void)startLoading {
NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
//给我们处理过的请求设置一个标识符, 防止无限循环,
[NSURLProtocol setProperty:@YES forKey:kBZURLProtocolKey inRequest:mutableReqeust];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
self.task = [session dataTaskWithRequest:self.request];
[self.task resume];
}
这里通过 task 来进行网络请求发送,也可以在这里进行请求的缓存处理,加快访问
最后需要设置代理方法,保证请求被允许和接收到数据后的加载
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
//允许请求加载
[[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
completionHandler(NSURLSessionResponseAllow);
}
- (void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
//加载数据
[[self client] URLProtocol:self didLoadData:data];
}
停止请求的时候注意销毁对象
- (void)stopLoading {
if (self.task != nil) {
[self.task cancel];
}
}
退出的时候也要注意移除监听










