美文网首页
UIWebView与JS交互

UIWebView与JS交互

作者: 痴人会说梦 | 来源:发表于2018-05-04 16:02 被阅读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语法组成的字符串

    • 通过UIWebview调用
    • 无法捕获异常,发生错误返回nil,若无返回值,无法判断调用是否成功
    • 返回值是NSString,当是其他类型,则需要进行解析.
    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,传递返回值参数),实现异步获取返回值

    相关文章

      网友评论

          本文标题:UIWebView与JS交互

          本文链接:https://www.haomeiwen.com/subject/bqgdrftx.html