美文网首页
OC与JS交互

OC与JS交互

作者: FallPine | 来源:发表于2017-02-28 20:29 被阅读25次
    • OC调用JS
    方法一(常用)

    利用WebView的stringByEvaluatingJavaScriptFromString方法调用JS代码

    //调用JS的callJS方法,并且传入param参数,这里要注意参数使用的是单引号‘’
    NSString *js = [NSString stringWithFormat:@"callJS('%@')",param];
    //把JS传入WebView的运行环境中
    NSString *string = [self.webView stringByEvaluatingJavaScriptFromString:js];
    
    方法二

    利用系统框架<JavaScriptCore/JavaScriptCore.h>的JSContext 类的evaluateScript调用JS的方法

    //获得WebView的运行环境的对象
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    //调用方法(注意:这里是JS里面的定义的方法),同样参数也是用单引号''括起来
    NSString *callJSstring = @"sendJSString('参数')";
    [context evaluateScript:callJSstring];
    
    • JS调用OC
    方法一

    通过加载WebView的时候截取URL的方式来进行交互,之前一直是用的这种方法,感觉比较麻烦

    在UIWebView的代理方法中进行拦截

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        // 方法一:直接通过request.mainDocumentURL.relativePath
        QSLog(@"%@", request.mainDocumentURL);
        QSLog(@"%@", request.mainDocumentURL.relativePath);
    
        // 方法二:按照url中的分隔符来对url进行分割
        NSString *urlString = [[request URL] absoluteString];
        urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSArray *arrFucnameAndParameter = [urlString componentsSeparatedByString:@"/"];
        NSString *subStr = arrFucnameAndParameter.lastObject;
    
        // 最后通过判断来做一些处理
    }
    
    方法二

    应用系统框架<JavaScriptCore/JavaScriptCore.h>

    此方法的重点是取到UIWebView的JS执行环境,并且OC代码必须在主线程中执行

    // 拿到WebView执行JS的执行环境,很重要的东西
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    

    1、block的方式

    // 拿到WebView执行JS的执行环境,很重要的东西
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    // 无参数,jstoocNoPrams是JS的方法名称
    context[@"jstoocNoPrams"] = ^(){
        // 调用方法处理内容
        NSLog(@"点击了没有传参数按钮");
        dispatch_async(dispatch_get_main_queue(), ^{
            // 执行OC代码
        });  
    };
    
    // 有参数 ,jstoocHavePrams是JS的方法名
    context[@"jstoocHavePrams"] = ^(){
       // 调用方法处理内容
        // 获得参数数组
        NSArray *prams = [JSContext currentArguments];
        NSString *arraySting = [[NSString alloc]init];
        for (id obj in prams) {
            NSLog(@"====%@",obj);
            arraySting = [arraySting stringByAppendingFormat:@"%@,",obj];
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            // 执行OC代码
        }); 
    };
    

    2、JSExport协议方式

    • 首先:自定义协议,并且协议遵守<JSExport>协议
      并且定义协议方法(就是JS调用的OC方法)
    @protocol QSJSExport <JSExport>
     - (void)JSCallOC;
     @end
    
    • 然后,在加载WebView之后注册协议
    - (void)regiseterProtocol
       {
         JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
       //change类似于JS里面的标识(change字符是自定义的,只要和JS中得一样就可以)
         [context setObject:self forKeyedSubscript:@"change"];
       }
    
    • 最后时限协议方法就行了
    - (void) JSCallOC
    {
       NSLog(@"JSCallOC");
     }
    

    非常感谢崖边树写的两篇文章,以上内容基本都摘抄自他的文章内容
    【JS与OC交互大总结之一 JS调用OC】
    【JS与OC交互大总结之二 OC调用JS】

    相关文章

      网友评论

          本文标题:OC与JS交互

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