UIWebView与JS交互

2018-05-04  本文已影响57人  痴人会说梦

UIWebView

JS调用OC

1.重定向URL拦截
每次打开一个链接之前,都会触发下面的代理方法

- (BOOL)webView:(UIWebView *)webView 
shouldStartLoadWithRequest:(NSURLRequest *)request 
navigationType:(UIWebViewNavigationType)navigationType

标准的URL包含scheme、host、port、path、query、fragment,通过判断来获取相应的参数和执行的方法
特点:比较灵活,常用于页面的跳转,但无法提供返回值,适用于单向传参,无回调的情况

2.JavaScriptCore(iOS 7.0 +)
WebKit都有一个内嵌的js环境,一般我们在页面加载完成之后,获取js上下文
JavaScriptCore是JS到OC的映射,可以替换各种js方法成oc方法.

//获取上下文
self.context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//设置OC的函数体
self.context[@“JSMethodName”] = ^() {
        NSArray *args = [JSContext currentArguments];//获取所有参数
        //args中的元素是JSValue,需要转成OC的对象
        NSMutableArray *messages = [NSMutableArray array];
        for (JSValue *obj in args) {
            [messages addObject:[obj toObject]];
        }
        NSLog(@"js传过来的参数:\n%@", messages);
      //do something .....
    };
//通过JSExport,设置js的代理为遵循JSExport的实例,在协议中定义交互的方法,在JavaScript中通过指定代理对象名称(比如下面:JavaScriptInterface),来调用协议中定义的方法,实现传参或者获取返回值到js环境
self.context[@"JavaScriptInterface"] = self;

OC调用JS

1.UIWebView的stringByEvaluatingJavaScriptFromString:

- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

可以看到返回值是NSString,参数script是js语法组成的字符串

  1. JavaScriptCore(iOS 7.0 +)
    通过JSContext的evaluateScript:方法来获取返回值。该方法得到的是一个JSValue对象,所以支持JavaScript的Array、Number、String、对象等数据类型。
//获取标题
JSValue *value = [self.context evaluateScript:@"document.title"];
//设置捕获异常回调
[self.context setExceptionHandler:^(JSContext *context, JSValue *exception){
        NSLog(@"%@", exception);
}];
//执行js的函数
[self.context evaluateScript:@“jsMethod()”];

WebViewJavascriptBridge的实现原理:

初始化将Webview的代理设置为自己,对当前self持有一个引用
js调用OC通过代理方法拦截,OC调用js通过webview执行evaluateScript:;将一个名为callback的function作为参数,通过一些封装,传递到OC(js->oc 传递参数和callbackId),然后在OC端执行完毕,再通过block来回调callback(oc->js,传递返回值参数),实现异步获取返回值

上一篇下一篇

猜你喜欢

热点阅读