目的是为了在webView页面截取到js操作,然后跳出到本地进行处理
第一种方法:使用原生的处理方式
1.下边是本地的a.html的源代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<script>
function test() {
alert('clicked');
}
function testParams(a, b){
alert(a+b);
}
</script>
</head>
<body>
<button onclick="test()">点击我</button>
<button onclick="testParams('hello', 123)">点击我(带参数)</button>
</body>
</html>
2.导入JavaScriptCore.framework,在需要调用的web页面加上头文件#import <JavaScriptCore/JavaScriptCore.h>
3.打开本地html文件
//打开本地html文件
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"a" ofType:@"html"];
NSURL *url = [NSURL fileURLWithPath:filePath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
4.开始截获
- (void)webViewDidFinishLoad:(UIWebView *)webView {
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"test"] = ^() {
NSLog(@"在这里便可以捕获到函数名为test的操作,这个操作不带参数");
};
context[@"testParams"] = ^(id data,id secondData) {
NSLog(@"在这里便可以捕获到函数名为testParams的操作,这个操作带两个参数");
NSLog(@"第一个参数是%@,第二个参数是%@",data,secondData);
NSArray *args = [JSContext currentArguments];
for (id obj in args) {
NSLog(@"遍历每一个参数,%@",obj);
}
};
}
第二种方法:使用github上的WebViewJavascriptBridge封装库
1.引入头文件 #import "WebViewJavascriptBridge.h",添加@property WebViewJavascriptBridge* bridge;
2.开始添加拦截
if (_bridge) {
return;
}
[WebViewJavascriptBridge enableLogging];
_bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
[_bridge registerHandler:@"hubOrderUpdateDeliveryDate" handler:^(id data, WVJBResponseCallback responseCallback) {
NSDictionary * dataDict = data;
NSLog(@"testObjcCallback called: %@", data);
//在此处进行拦截
}];
**这个封装库,要求JS函数也按照一定标准写
**WebViewJavascriptBridge有很多方法,包括OC调用JS,JS调OC,很方便,推荐给大家


浙公网安备 33010602011771号