美文网首页
OC与js的交互

OC与js的交互

作者: _技术支持 | 来源:发表于2016-08-03 09:51 被阅读0次

    js与oc的交互分别由两种

    一.oc对js的调用:

    1.我们通过UIWebView自带的一个方法stringByEvaluatingJavaScriptFromString:
    调用JavaScript代码就可以实现调用我们网页上的方法了
    [webView stringByEvaluatingJavaScriptFromString:@"alert('测试')"];
    具体可以参考http://www.jianshu.com/p/786a897694c1

    2.其次就是通过JavaScriptCore.framework来进行对网页js的操作

    //创建JSContext对象,(此处通过当前webView的键获取到jscontext)
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    //OC调用JS方法---test1是js里的方法 这例我们就可以调用网页上js的方法了
    [context evaluateScript:@"test1()"];```
    
    ####  二.js对oc的调用
    主要是通过利用苹果系统框架<JavaScriptCore/JavaScriptCore.h>
    嗯在执行js方法时如果传的参数带有换行好像会引起错误,大家注意一下。
    
    1.JSContext的block方式:
          
    

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

    //这是交互方法
    context[@"jsmethod"] = ^(){
    NSLog(@"你要做的事");
    };
    //js只需要调用方法 jsmethod(); 就可以实现我们block里面的内容了

    2.JSExport协议方式---类方式
    我们需要先 ----在.h文件里自定义协议,并且协议遵守<JSExport>协议并且定义协议方法(就是JS调用的OC方法)
    

    @protocol JSExport <JSExport>
    // 这里需要注意js调用时需要换一个写法:如下
    // iosshare.textJSExportWithParameterTwoParameter('parameter1', 'parameter2');

    • (void)textJSExportWithParameter:(NSString *)parameter1 TwoParameter:(NSString *)parameter2;
      @end
    
    在.m文件中你需要让他去遵守这个协议,实现他的协议方法
    

    @interface JSObj()<JSExport>

    @end

    @implementation JSObj

    • (void)textJSExportWithParameter:(NSString *)parameter1 TwoParameter:(NSString *)parameter2{
      NSLog(@"你要做的事");
      }
    
    类创建完了当然应该去建立联系,
    我们需要在VC中去调用他
    

    //创建context
    JSContext *context=[_webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    // 建立联系
    JSObj *testJO=[JSObj new];
    context[@"ios_js"] = testJO;

    // 然后就是js对他的调用了--这里就不帖后台代码了,直接用oc调用js的方法调用
    [self.context evaluateScript:@"ios_js.textJSExportWithParameterTwoParameter('parameter1','parameter2');"];

    这样就可以实现了。
    之前我们公司的应用都是通过拦截url进行各种操作的,如果不是查找了些资料都不知道现在都不用这方法了,这里就不提拦截url的方法了。
    
    
    1.需要注意就是如果你需要对界面进行什么操作的话要加载主线程,不然是会crash的。
    2.关于调用JSContext之后的一些内存问题,看了一些文章也不是很懂,如果有了解一些的小伙伴多多交流啊。可以参考这篇简书-[快点我](http://www.jianshu.com/p/a329cd4a67ee)
    嗯,差不多就这样了。第一篇博文,多很多不足的地方多多包涵。

    相关文章

      网友评论

          本文标题:OC与js的交互

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