服务器要求在所有请求当中添加Header进行验证,
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType方法拦截不到相关的css,js文件请求。这里要用NSURLProtocol,这是一个挺牛逼的类,它是一个抽象类,不能去实例化它,只能子类化NSURLProtocol ,每次在对一个 URL 进行请求的时候 URL Loading System 都会向 已经注册的 Protocol 询问是否可以处理该请求。这里就看出他的作用来了. 比如: 拦截UIWebView的请求,忽略请求,重定向... ...
直接贴代码:
#import <Foundation/Foundation.h> @interface NSURLProtocolCustom : NSURLProtocol
#import "NSURLProtocolCustom.h" static NSString* const FilteredKey = @"FilteredKey"; @interface NSURLProtocolCustom ()<NSURLSessionDataDelegate> @property (atomic, strong, readwrite) NSURLSessionDataTask *task; @property (nonatomic, strong ) NSURLSession *session; @implementation NSURLProtocolCustom + (BOOL)canInitWithRequest:(NSURLRequest *)request NSString *scheme = [[request URL] scheme]; if ( ([scheme caseInsensitiveCompare:@"http"] == NSOrderedSame || [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame)) if ([NSURLProtocol propertyForKey:FilteredKey inRequest:request]) { + (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request { NSMutableURLRequest *mutableReqeust = [request mutableCopy]; [mutableReqeust setValue:@"abc" forHTTPHeaderField:@"Authorization"]; NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy]; [NSURLProtocol setProperty:@YES forKey:FilteredKey inRequest:mutableReqeust]; NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; self.session = [NSURLSession sessionWithConfiguration:configure delegate:self delegateQueue:queue]; self.task = [self.session dataTaskWithRequest:mutableReqeust]; [self.session invalidateAndCancel]; - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error [self.client URLProtocol:self didFailWithError:error]; [self.client URLProtocolDidFinishLoading:self]; - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; completionHandler(NSURLSessionResponseAllow); - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data [self.client URLProtocol:self didLoadData:data]; - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask willCacheResponse:(NSCachedURLResponse *)proposedResponse completionHandler:(void (^)(NSCachedURLResponse * _Nullable))completionHandler completionHandler(proposedResponse); - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)newRequest completionHandler:(void (^)(NSURLRequest *))completionHandler NSMutableURLRequest * redirectRequest; redirectRequest = [newRequest mutableCopy]; [[self class] removePropertyForKey:FilteredKey inRequest:redirectRequest]; [[self client] URLProtocol:self wasRedirectedToRequest:redirectRequest redirectResponse:response]; [[self client] URLProtocol:self didFailWithError:[NSError errorWithDomain:NSCocoaErrorDomain code:NSUserCancelledError userInfo:nil]]; - (instancetype)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id<NSURLProtocolClient>)client self = [super initWithRequest:request cachedResponse:cachedResponse client:client];
最后在用到的webview类里进行注册和注销即可
[NSURLProtocol registerClass:[NSURLProtocolCustom class]];
-(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [NSURLProtocol unregisterClass:[NSURLProtocolCustom class]];
|