iOS UIWebView实现无图模式

创建MyURLProtocol,继承自NSURLProtocol

MyURLProtocol.h
#import 

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];
}

查看效果

iOS UIWebView实现无图模式_第1张图片
image

你可能感兴趣的:(iOS UIWebView实现无图模式)