博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
思考 NSURLProtocol 无法拦截 WKWebview 请求的解决思路
阅读量:3594 次
发布时间:2019-05-20

本文共 2656 字,大约阅读时间需要 8 分钟。

1.hook XMLHTTPRequest

原理简单说就是 hook XMLHTTPRequest 的 send 方法和 open 函数,然后在里面重组 url 和 body 参数,然后重新发起请求,这边有个难点,就是 send 和 open 是异步的,所以需要等 hook 到 open 中的参数后再发起请求。

2.WKURLSchemeHandler

WKURLSchemeHandler 是 iOS11 就推出的,用于处理自定义请求的方案,不过并不能处理 HTTP、HTTPS 等常规 scheme。但是现在有另外一个方法,就是去 hook WKWebview 的 initWithFrame: 方法,然后在 hook 方法中设置一个 WKURLSchemeHandler 给 WKWebview 实例,这样就能截获 WKWebview 的 HTTP 和 HTTPS 请求了。范例如下

////  ViewController.m//  WKWebviewURLSchemeHandlerProject////  Created by jerrold on 2019/3/5.//  Copyright © 2019 jerrold. All rights reserved.//#import "ViewController.h"#import 
@interface CustomURLSchemeHandler : NSObject
@end@implementation CustomURLSchemeHandler//这里拦截到URLScheme为customScheme的请求后,读取本地图片test.jpg,并返回给WKWebView显示- (void)webView:(WKWebView *)webView startURLSchemeTask:(id
)urlSchemeTask{ NSURLRequest *request = urlSchemeTask.request; //在下面处理拦截到的HTTP和HTTPS请求,处理完后再次发起请求, 注意要处理didReceiveResponse: didReceiveData: didFinish三个方法回调 if ([request.URL.scheme containsString:@"https"]) { }else if ([request.URL.scheme containsString:@"http"]){ }// UIImage *image = [UIImage imageNamed:@"test.jpg"];// NSData *data = UIImageJPEGRepresentation(image, 1.0);// NSURLResponse *response = [[NSURLResponse alloc] initWithURL:request.URL MIMEType:@"image/jpeg" expectedContentLength:data.length textEncodingName:nil];// [urlSchemeTask didReceiveResponse:response];// [urlSchemeTask didReceiveData:data];// [urlSchemeTask didFinish];}- (void)webView:(WKWebView *)webVie stopURLSchemeTask:(id)urlSchemeTask {}@end@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //如下是以APP为视角写的处理WKWebview请求的方式,如果要AOP,就需要hook WKWebview的initwithFrame方法,在里面处理WKWebview的请求 WKWebViewConfiguration *configuration = [WKWebViewConfiguration new]; CustomURLSchemeHandler *handler = [[CustomURLSchemeHandler alloc]init]; NSMutableDictionary *handlers = [configuration valueForKey:@"_urlSchemeHandlers"]; handlers[@"https"] = handler;//修改handler,将HTTP和HTTPS也一起拦截 handlers[@"http"] = handler; WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration]; self.view = webView; [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.test.com"]]];}@end复制代码

不过,这种方案和第一种有共性,就是利用了私有 API,很可能导致被 ban,毕竟 apple 最近审查非常严苛。但是起码比第一种方案好,不用担心 body 大小的问题,不用担心影响浏览器性能。

参考文献

1.

2.

3.

作者:Auditore
链接:https://juejin.im/post/5cac5046518825710d76c4e1
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的文章
Django的URL路由
查看>>
django的视图响应类型
查看>>
Django的模板引擎与模板使用
查看>>
liunx安装chrome浏览器
查看>>
tensorflow矩阵的运算
查看>>
tensorflow更新变量
查看>>
sublime 显示文件编码
查看>>
filter,map,reduce
查看>>
sublime text3打开浏览器
查看>>
django中url参数的转换器
查看>>
url命名与反转,应用命名空间与实例命名空间
查看>>
django自定义URL(PATH)转换器
查看>>
随机请求头
查看>>
python中threading多线程以及传参
查看>>
pandas中按照某一列进行排序
查看>>
python中pyodbc连接sql server数据库
查看>>
django2.0,python3.7连接sql_server
查看>>
Python 生成requirement及使用requirements.txt安装类库
查看>>
multiprocessing.pool多线程的使用
查看>>
非计算机专业本科毕业如何迅速成长为一名算法工程师
查看>>