看简书上说一共有六种OC和JS交互的方法,但是前三种原理都一致,都是通过检测、拦截Url地址实现互相调用的。剩下的react native等第三方框架原理不一样,也没有去研究,下边记录我使用的三种方法(原理都是拦截Url地址)。

  (一)、使用系统自带JavaScriptCore库进行交互,支持iOS7以后系统。(备注:我这个项目在交互MBProgress的时候控制隐藏,js代码会发生奔溃,安卓是好的,原因始终找不到)

oc调用js方法

[homeWebView stringByEvaluatingJavaScriptFromString:jsFunction];

-------------------------------------------------------------------

js调用oc方法导入

  1、JavaScriptCore库

  #import <JavaScriptCore/JavaScriptCore.h>

  2、获得上下文

- (void)webViewDidFinishLoad:(UIWebView *)webView{

    //降低webview带来的内存泄露

    [[NSUserDefaultsstandardUserDefaults] setInteger:0forKey:@"WebKitCacheModelPreferenceKey"];

    //----------------------JS回掉方法----------------------------------------

  JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

//没有返回值的写法

    context[@"showProgressDialogPhone"] = ^() { // 显示

        [self showProgressDialog];

    };

  // 有返回值的写法,

  context[@"getTabInfoIOS"] = [self getTabInfoIOS];//获得权限

}

3、js端绑定方法oc方法,绑定的这个方法名称必须要和oc里注册的方法名称保持一致

   function showProgressDialog(){

      showProgressDialogPhone();

    }

(二)、实现了JSExport协议的协议,这样调用到vc里的方法

1、声明协议,实现协议方法

在.h文件中声明

@protocol TestJSObjectProtocol <JSExport>

-(void)closeProgressDialog;

@end

.m文件中实现协议方法

@interface ViewController ()<TestJSObjectProtocol>

@end

1、同上先获得上下文,oc这里绑定方法、实现closeProgressDialog方法

        ViewController *viewCtlOBJ = [ViewController new];

        context[@"viewCtlOBJ"] = viewCtlOBJ;

        NSString *jsStr1=[NSString stringWithFormat:@"viewCtlOBJ.closeProgressDialog()"];

        [context evaluateScript:jsStr1];

2、js这边调用oc方法

function closeProgressDialog(){

 viewCtlOBJ.closeProgressDialog();

}

(三)、使用WebViewJavascriptBridge进行oc和js的交互

备注:兼容iOS7以下版本,我最终使用的这个方法,解决掉js代码崩溃的问题。这个类库是异步执行的,优点:调用oc和js代码优雅,传值和回调方便

1、先导入WebViewJavascriptBridge包,可参考上一篇文章导入。

  #import "WebViewJavascriptBridge.h"

  @propertyWebViewJavascriptBridge* bridge;

  2、OC原生注册方法,实现方法

   [WebViewJavascriptBridgeenableLogging];

    _bridge = [WebViewJavascriptBridgebridgeForWebView:homeWebView];

    [_bridgesetWebViewDelegate:self];

    /***

     /js调用oc

     /@param registerHandler 要注册的事件名称(这里我们为showProgressDialogPhone)

     /@param handel 回调block函数 当后台触发这个事件的时候会执行block里面的代码

     ***/

    [_bridgeregisterHandler:@"showProgressDialogPhone"handler:^(id data, WVJBResponseCallback responseCallback) {

        NSLog(@"显示加载");

        [self showProgressDialog];

        responseCallback(@"Response 显示加载");

    }];

  3、js端调用注册的方法

  //固定写法

function setupWebViewJavascriptBridge(callback) {

    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }

    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }

    window.WVJBCallbacks = [callback];

    var WVJBIframe = document.createElement('iframe');

    WVJBIframe.style.display = 'none';

    WVJBIframe.src = 'https://__bridge_loaded__';

    document.documentElement.appendChild(WVJBIframe);

    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)

}

    setupWebViewJavascriptBridge(function(bridge) {

                                 bridge.callHandler('showProgressDialogPhone', function(response) {

                                                  alert(response);

                                                    })

                                 });

-----------------------------------------------------------------------------------------

   //oc调用js代码

     bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {

   log('ObjC called testJavascriptHandler with', data)

       var responseData = { 'Javascript Says':'Right back atcha!' }

                                                  responseCallback(responseData)

                                                  })

    //需要传参数,不需要从后台返回执行结果

    /***

     @param callHandler 商定的事件名称,用来调用网页里面相应的事件实现

     @param data id类型,相当于我们函数中的参数,向网页传递函数执行需要的参数

     ***/

//    [_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];

--------------------------------------------------------------------------------------

OC和JS交互的三种方法的更多相关文章

  1. js 与ios 交互的三种方法

    第一种:IOS拦截url  实现跳转 参考链接:http://www.cnblogs.com/pengyingh/articles/2354381.html IOS9.0 及以上支持 第二种:IOS ...

  2. 判断点击第几个按钮JS代码的三种方法

    方法一:使用下标实现<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  3. js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数

    文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法  先创建一个对象函数 function Obj() { this.addre ...

  4. asp.net后台向前端输出js脚本的三种方法

    //这个方法最快,因为它会输出到html标签之前 Response.Write("<script type='text/javascript'>alert('这个最快')< ...

  5. js深度复制三种方法

    1.用递归的方式进行深度复制 2.用JSON.stringify加上JSON.parse()进行深度复制 3.用jquery中自带的方法$.extend()进行深度复制 具体实现代码可百度自行查询

  6. js创建对象的三种方法

    1.使用对象初始化器:{} var person = {....} 2 var person=new object() function person(参数) { this.参数=... } var ...

  7. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  8. (转)在网页中JS函数自动执行常用三种方法

    原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...

  9. JS模拟实现封装的三种方法

      前  言  继承是使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承!  JS中有很多实现继承的方法,今天我给大家介绍其中的三种吧. 1.在 Object类上 ...

随机推荐

  1. 芝麻HTTP:

    只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理. 具体拼接代码如下: def process_item(self, ...

  2. Unity开发之存档和读档的三种实现方式

    此文内容源自siki学院视频,仅供学习!视频链接地址:http://www.sikiedu.com/course/129 工程使用Unity 2017.3.0f3 (64-bit) 老司机读博客,了解 ...

  3. JNDI在server.xml中的配置(全局和局部的)

    总结: 全局就是在数据源server.xml中配置,然后通过和项目名相同的xml来进行映射.对所有的项目都起作用.那个项目需要就在对应的tomcat下配置一个与项目名相同的xml映射文件. 局部的就是 ...

  4. PhotoShop制作简单的文字动画--多媒体技术与应用

    下面是最终实现的效果图: 1.新建图像,设置图像属性如下所示. 2.使用[横排文字工具]在背景图像上打上文字内容 3.[图层]——>[图层式样]——>[渐变叠加] 出现“图层样式”面板 4 ...

  5. Python机器学习:5.6 使用核PCA进行非线性映射

    许多机器学习算法都有一个假设:输入数据要是线性可分的.感知机算法必须针对完全线性可分数据才能收敛.考虑到噪音,Adalien.逻辑斯蒂回归和SVM并不会要求数据完全线性可分. 但是现实生活中有大量的非 ...

  6. Java微服务对UTC时间格式的处理

    一.背景 先说一下为什么要使用UTC时间.开发一个全球化的系统,服务端(Java微服务)集中部署在同一个地方,用户在全球通过浏览器.手机客户端访问.不同地区的时区是不一样的,同一个时间戳,不同的用户看 ...

  7. jQuary学习の一の初期准备

    jQuery 的功能概括: 1.html 的元素选取 2.html的元素操作 3.html dom遍历和修改 4.js特效和动画效果 5.css操作 6.html事件操作 7.ajax异步请求方式 通 ...

  8. css学习の第一四弹—代码格式简写归纳

    一.代码简写方式归纳 >>1.盒模型代码简写: 外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左 1.如果t ...

  9. 应用openvpn

    本文目录:1.vpn概述 1.1 vpn应用场景 1.2 隧道协议 1.3 SSL VPN和IPSEC VPN2.openvpn搭建client-to-site的vpn 2.1 安装lzo和openv ...

  10. django Forbidden

    Forbidden (CSRF cookie not set.)解决方法 Forbidden (CSRF cookie not set.):xxx解决方法:在django项目的settings.py文 ...