JS 与 OC

做项目需要从网页点击跳转到app的一个页面上,并且需要获取参数。

当时后台给写的参数是这样的。自己打开浏览器看的源码

JavaScript:window.location.href=   这句话在js里是弹出网页的意思

而我只需要把弹出的信息截取获取参数就可以了

这种直接弹出信息需要靠webView的delegate方法来解决

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    
    NSString *getURLString = [request.URL absoluteString];
    NSLog(@"总的字符串:%@",getURLString);
    
    NSString *htmlHeadString = @"objc://";
    //协议头可以自己定义可以自己定义
    if([getURLString hasPrefix:htmlHeadString])
    {
        NSLog(@"参数来了");
    // 这里可以将网址拆分成所需要的参数 并且完成你所需要的操作 (跳转等等)
return NO; } else return YES; }

这时就解决了

而本着好学的精神又了解了另外的方法

HTML代码如下

<html>
    <head>
        <title>第二个web</title>
        <meta charset="utf-8">
    </head>
    
    <body>
        
        <p>JS通过JavaScriptCore/JavaScriptCore.hOC的方法</p>
        
        <p>姓名:孟玲旭</p>

        <p>博客主页:</p>
        <p >https://home.cnblogs.com/u/menglingxu/</p>
        
        <button type = "button" onclick = "locationFunction()" > JS调OC第二法无参数 </button>
         <button type = "button" onclick = "locationFunction2()" > JS调OC第二法传参数 </button>
          <button type = "button" onclick = "change.callChangeColor()" > 点击改变颜色</button>
        
        <script type = "text/javascript">
            function locationFunction()
            {
                //调用OC的方法,没有参数
                jstoocNoPrams();
                
            }
        
            function locationFunction2()
            {
              //调用OC的第二个方法
              jstoocHavePrams('参数1','参数2','参数3');
            }
        </script>
    </body>
    
</html>

这时已经给了oc两个方法,一个是  jstoocNoPrams  第二个是  jstoocHavePrams

我们要做的就是县引入框架

#import <JavaScriptCore/JavaScriptCore.h>

然后得到方法

- (void)handleJScallOC
{
    
    //拿到WebView执行JS的执行环境,很重要的东西
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    //点击了无参数,jstoocNoPrams是JS的方法名称
    context[@"jstoocNoPrams"] = ^(){
        NSLog(@"点击了没有传参数按钮");
        // 在这里完成操作
        dispatch_async(dispatch_get_main_queue(), ^{
            
        });
        
    };
    
    
    //点击传参数 jstoocHavePrams方法名称
    context[@"jstoocHavePrams"] = ^(){
        //获得参数
        NSArray *prams = [JSContext currentArguments];

        
        NSLog(@"%@", prams);
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
        });
        
    };

    
    
}

这就是block的方式

细心的同学会发现

 <button type = "button" onclick = "change.callChangeColor()" > 点击改变颜色</button>  

这句话咋还没用上呢

这就是最后一种方法  协议的方式

首先写一个协议 注意名字 callChangeColor() 不要写错

@protocol MLGB <JSExport>

- (void)callChangeColor;

@end

然后遵循协议


最后

#pragma mark - 第二种方式JSEport协议方式
- (void)regiseterResponser
{
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    [context setObject:self forKeyedSubscript:@"change"];
}

- (void)callChangeColor
{
    NSLog(@"MLGB");
  // 实现所需要的操作。 }

 以上就是JS调用OC

既然JS可以调用OC,那么OC 当然可以调用js

HTML代码

<html>
    
    <head>
    </head>
    
    <body>
        
        <meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
        <br>
        <p>OC调用JS的方法</p>
        <p>方法:stringByEvaluatingJavaScriptFromString</p>
        <br>
        <p>我的主页:</p>
        <p >https://home.cnblogs.com/u/menglingxu/</p>
            <script type="text/javaScript">
                
                function callJS(param)
                {
                    alert(param);
                }
            </script>
        
    </body>
    
</html>

方法名为callJS(param)

那么OC代码为

- (void)callJS
{
    NSString *param = @"放屁";
    NSString *js = [NSString stringWithFormat:@"callJS('%@')",param];
    NSString *string = [self.webView stringByEvaluatingJavaScriptFromString:js];
    NSLog(@"%@",string);
    
}

可以在webview加载完成之后看看效果

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [self callJS];
}

最主要的方法  :stringByEvaluatingJavaScriptFromString

或者 用第二种方法也是webview加载完成之后看看效果

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
//    [self callJS];
    //获得WebView的运行环境的对象
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    //调用方法(注意:这里是JS里面的定义的方法)
    NSString *callJSstring = @"callJS('憋不住了,要放屁')";
    [context evaluateScript:callJSstring];
}

千万别忘了方法名为callJS(param)这个方法OC在写的时候是这样的callJS('参数');

原文地址:https://www.cnblogs.com/menglingxu/p/6256120.html