美文网首页
js里面通过对象调用OC原生方法

js里面通过对象调用OC原生方法

作者: 土土土土的豆豆 | 来源:发表于2018-01-07 16:51 被阅读0次

    webView

    js调用iOS分两种情况

    一,js里面直接调用方法
    二,js里面通过对象调用方法

    先来看看直接调用的情况

    -(void)webViewDidFinishLoad:(UIWebView *)webView  
    {  
        //网页加载完成调用此方法  
          
        //iOS调用js  
          
        //首先创建JSContext 对象(此处通过当前webView的键获取到jscontext)  
        JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
        
        //js调用iOS  
        //第一种情况  
        //其中test1就是js的方法名称,赋给是一个block 里面是iOS代码  
        //此方法最终将打印出所有接收到的参数,js参数是不固定的 我们测试一下就知道  
        context[@"test1"] = ^() {  
            NSArray *args = [JSContext currentArguments];  
            for (id obj in args) {  
                NSLog(@"%@",obj);  
            }  
        };  
        //此处没有写后台(但是我们iOS是可以调用js的,我们模拟一下)  
        //首先准备一下js代码,来调用js的函数test1 然后执行  
        //一个参数  
        NSString *jsFunctStr=@"test1('参数1')";  
        [context evaluateScript:jsFunctStr];  
          
        //二个参数  
        NSString *jsFunctStr1=@"test1('参数a','参数b')";  
        [context evaluateScript:jsFunctStr1];  
          
    }  
    

    以上代码中 给test1赋值的block要是执行了那么结果就是对的,js调用了iOS
    我们看结果

    image.png
    我们看到参数被打印出来了,而且一个参数和两个参数都可以,也符合js参数个数不限制
    下来我们看第二种情况 就是js 中是通过一个对象来调用方法的。

    这种方式我们需要使用到JSExport协议
    凡是遵守了JSExport协议的协议所规定的方法、变量等就会对js开放,我们可以通过js调用到这些方法或变量

    使用步骤请看下面的例子

    一、我们首先创建一个继承自NSObject的类: JSObject

    image.png
    二、导入JavaScriptCore库
    image.png
    三、创建一个遵守JSExport协议的协议并让我们创建的类实现上边的协议
    image.png

    四、加入方法和实现
    方法加入:直接把方法写在协议里即可,跟写正常的.h里面的OC方法一样 如果js是一个参数或者没有参数的话 就比较简单,我们的方法名和js的方法名保持一致即可,如果有多个参数,那么从第二个参数起,参数名的首字母要大写


    image.png

    方法实现:直接在.m中实现方法即可


    image.png

    下面我们在weibview加载完成之后调用测试一下


    image.png
    扩展

    可以把所有需要提供给js调用的方法都写在JSObject这个类当中,通过代理的方式与需要执行这些操作的类进行连接,也就JSObject这个类只负责提供方法,不负责实现,具体的操作可以在具体的添加有webView的控制器里实现(详见Demo)

    然后把这些方法的名称和参数说明做成一张表格进行维护,便于web断查看调用!

    相关文章

      网友评论

          本文标题:js里面通过对象调用OC原生方法

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