问题遇到的现象和发生背景
在做WKWebView 重定向的时候需要拦截WKWebView,使用了NSURLProtocol或者WKURLSchemeHandler俩种方案都试过了但是都不能好好解决,目前使用WKURLSchemeHandler方案,在拦截https://mail.qq.com的时候不能做到很好的拦截?提示报的是csp相关报错。求解?
问题相关代码,请勿粘贴截图
- (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});Method originalMethod1 = class_getClassMethod(self, @selector(handlesURLScheme:)); Method swizzledMethod1 = class_getClassMethod(self, @selector(yyhandlesURLScheme:)); method_exchangeImplementations(originalMethod1, swizzledMethod1);
} - (BOOL)yyhandlesURLScheme:(NSString *)urlScheme {
if ([urlScheme isEqualToString:@"http"] || [urlScheme isEqualToString:@"https"] || [urlScheme isEqualToString:@"file"]) {
} else {return NO; //这里让返回NO,应该是默认不走系统断言或者其他判断啥的
}return [self handlesURLScheme:urlScheme];
}
#pragma mark - WKURLSchemeHandler
- (void)webView:(WKWebView *)webView startURLSchemeTask:(id )urlSchemeTask
{
}NSURLRequest *request = urlSchemeTask.request; NSURLRequest *httpRequest = [self httpRequest:request]; NSString *mineType = [[self class] mimeTypeForData:httpRequest.HTTPBody]; [self.hashTable addObject:urlSchemeTask]; NSURLSessionDataTask *task = [self.session dataTaskWithRequest:httpRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (![self.hashTable containsObject:urlSchemeTask]) { return ; } if (response) { [urlSchemeTask didReceiveResponse:response]; } if (data) { [urlSchemeTask didReceiveData:data]; } if (error) { [urlSchemeTask didFailWithError:error]; } else { [urlSchemeTask didFinish]; } [self.hashTable removeObject:urlSchemeTask]; }]; [task resume];
- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id )urlSchemeTask
{
[self.hashTable removeObject:urlSchemeTask];
}
运行结果及报错内容
我的解答思路和尝试过的方法
#pragma mark - WKURLSchemeHandler
- (void)webView:(WKWebView *)webView startURLSchemeTask:(id )urlSchemeTask
{
}NSURLRequest *request = urlSchemeTask.request; NSURLRequest *httpRequest = [self httpRequest:request]; NSString *mineType = [[self class] mimeTypeForData:httpRequest.HTTPBody]; [self.hashTable addObject:urlSchemeTask]; NSURLSessionDataTask *task = [self.session dataTaskWithRequest:httpRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (![self.hashTable containsObject:urlSchemeTask]) { return ; } if (response) { [urlSchemeTask didReceiveResponse:response]; } if (data) { [urlSchemeTask didReceiveData:data]; } if (error) { [urlSchemeTask didFailWithError:error]; } else { [urlSchemeTask didFinish]; } [self.hashTable removeObject:urlSchemeTask]; }]; [task resume];
我想要达到的结果
拦截包含csp网页并成功请求网页