创建MyURLProtocol,继承自NSURLProtocol
MyURLProtocol.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyURLProtocol : NSURLProtocol
@end
NS_ASSUME_NONNULL_END
MyURLProtocol.m
#import "MyURLProtocol.h"
@implementation MyURLProtocol
/*
这个方法是当前类注册到NSURLProtocol后,NSURLProtocol就会通过这个方法确定参数request是否需要被处理
根据返回值判断是否对request进行处理,return YES 表示当前request需要被处理
*/
+(BOOL)canInitWithRequest:(NSURLRequest *)request{
//获取url的后缀
NSString* extension = request.URL.pathExtension;
NSArray *array = @[@"png", @"jpeg", @"gif", @"jpg",@"PNG",@"JPEG",@"JPG"];
//如果数组中包含当前请求的后缀,就处理这个请求,跳转startLoading
if([array containsObject:extension]){
return YES;
}
return NO;
}
/*
这个方法就是返回规范的request
*/
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request{
return request;
}
/*
字面意思,开始加载请求
canInitWithRequest 返回YES时,执行这里
*/
- (void)startLoading{
//搞一个空的data
NSData *data = [NSData new];
//针对当前请求,重定向到这个data
[self.client URLProtocol:self didLoadData:data];
}
// 这个方法是和start是对应的 一般在这个方法中,断开Connection
// 另外一点就是当NSURLProtocolClient的协议方法都回调完毕后,就会开始执行这个方法了
- (void)stopLoading{
}
// 这个方法主要用来判断两个请求是否是同一个请求,
// 如果是,则可以使用缓存数据,通常只需要调用父类的实现即可,默认为YES,而且一般不在这里做事情
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b {
return [super requestIsCacheEquivalent:a toRequest:b];
}
@end
使用MyURLProtocol
- (void)viewDidLoad {
[super viewDidLoad];
//注册MyURLProtocol
[NSURLProtocol registerClass:[MyURLProtocol class]];
self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sina.com"]];
[self.webView loadRequest:request];
[self.view addSubview:self.webView];
}
查看效果