JavaScriptCore 时代的通讯

iOS 7 开始,苹果提供了一个叫作 JavaScriptCore 的框架,使用 JavaScriptCore 框架可以实现 OC 和 JS 的互相调用,而不需要依赖「桥」来实现,怎么通讯呢?

JavaScriptCore 中 OC 调用 JS 方法

在 JS 中定义一个方法

1
2
3
function alertFunc() {
window.alert("这是一个JS中的弹框!")
}

在 webViewDidFinishLoad: 代理方法中,获取到 JSContext 对象(在这里用到的就是这个方法:

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

1
2
3
4
5
6
7
8
9
- (void)webViewDidFinishLoad:(UIWebView *)webView {
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
[context setExceptionHandler:^(JSContext *ctx, JSValue *expectValue) {
NSLog(@"%@", expectValue);
}];
self.context = context;
}

在一个 button 的点击事件中可以根据 JS 定义的方法的名字获得一个 JSValue 类型对象,这个对象就是在 JS 中定义的方法,JSValue 对象通过调用 callWithArguments: 方法,执行这个 JS 方法。

1
2
3
4
5
6
7
8
- (IBAction)buttonClick:(UIButton *)sender {
if (!self.context) {
return;
}
JSValue *funcValue = self.context[@"alertFunc"];
[funcValue callWithArguments:nil];
}

点击按钮时,效果如下。

实现了 OC 中调用 JS 的方法。

JS 调用 OC 中的方法

在 OC 中,通过给 JSContext 的一个 key 赋值,值为一个 block,key 是 JS 中调用的方法的名字,代码如下:

在这里需要提一下,这里用到了weak-strong dance,用weak是为了防止循环引用,用weak-strong dance是为了在block内部能够访问到self的属性,所以就使用weak-strong dance。但是在xcode7.3之后就不需要使用weak-strong dance了,因为系统已经升级,不需要weak-strong dance依然能够访问到self的属性(使用weakSelf即可)。

1
2
3
4
5
6
7
8
9
10
11
12
13
self.context[@"ocAlert"] = ^{
// block 异步执行,如果涉及到 UI 的操作需要回到主线程操作
dispatch_async(dispatch_get_main_queue(), ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:@"这是OC中的弹框!" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[alert dismissViewControllerAnimated:YES completion:^{
}];
}]];
[strongSelf.navigationController presentViewController:alert animated:YES completion:nil];
});
};

在 Web 页面中创建一个 button 并设置 button 的 onClick 事件调用 ocAlert 方法

1
<button οnclick="ocAlert()">点击这里</button>

点击 Web 页面上的 button 按钮,效果如下

实现了 JS 调用 OC 中的方法。

是不是方便了很多?

写在后面

以上当然只是 JavaScriptCore 框架的一个很小的应用,使用 JavaSciptCore 框架结合 Objective-C 的动态性可以做很多事,比如著名的热修复框架 JSPatch 就是这两者的结合。这里只是演示了 JS 和 OC 之间的方法调用,并没有传输数据,JavaScriptCore 框架是很容易的实现两者之间的数据传输的。

使用 JavaScriptCore 实现通讯的 demo 放到了 GitHub,地址如下:
https://github.com/cielpy/CPYJSCoreDemo

这篇文章是整理了Kevin Guo的博客,然后把自己理解结合了一下。

转载于:https://www.cnblogs.com/ansyxpf/p/5628995.html

JS和OC间的通信(使用JavaScriptCore)相关推荐

  1. ios传值给js_WKWebView JS与OC间相互传值调用

    写在前面 本文将介绍如何使用WKWebView进行JS与OC.OC与JS间的传值和方法调用. 前置条件 1.导入WebKit.framework 2.声明WKWebView JS调用OC原生方法 1. ...

  2. iOS JS与OC交互

    iOS JS与OC交互 本文内容导航 1.`UIWebView` JS 与 OC 交互 1.1 OC 调用 JS 函数 1.1.1 OC 拼接 JS 字符串调用 JS 方法 1.1.2 使用 JSCo ...

  3. iOS下JS与OC互相调用(四)--JavaScriptCore

    前面讲完拦截URL的方式实现JS与OC互相调用,终于到JavaScriptCore了.它是从iOS7开始加入的,用 Objective-C 把 WebKit 的 JavaScript 引擎封装了一下, ...

  4. iOS中JS 与OC的交互(JavaScriptCore.framework)

    iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...

  5. Node-Webkit:nw.js 父子窗口间通信 Child window to call parent window

    Node-Webkit:nw.js 父子窗口间通信 Child window to call parent window 先看效果 感谢网友分享 参考文章http://www.360doc.com/c ...

  6. iOS下JS与OC互相调用(一)--UIWebView 拦截URL

    1.在JS 中做一次URL跳转,然后在OC中拦截跳转.(这里分为UIWebView 和 WKWebView两种,去年因为还要兼容iOS 6,所以没办法只能采用UIWebView来做.) 2.利用WKW ...

  7. JS与OC中的方法相互调用

    文章主要是介绍oc如何调用js 以及js的代码调用oc的方法 先上代码后做解释 //oc的.m 的代码 //ps接下来有js的代码一并解析,最后会附上demo //  ViewController.m ...

  8. 页面url带参数_微信小程序云开发教程微信小程序的JS高级页面间数据传递

    同学们大家好,我是小伊同学,上一节课我们讲解了全局数据的读写方法,那么在页面间同样需要数据交互,今天我们就来学习这部分内容. 在微信小程序中,我们常常需要将数据在页面之间进行传递,比如用户的身份信息, ...

  9. JS与OC的交互 WebViewJavaScriptBridge WEB微信支付

    JS与OC的交互 WebViewJavaScriptBridge WEB微信支付: Markdown及扩展 网上找了挺多的,自己给自己总结了一下(仅供小白参考,大牛就放过我吧)说白了就是混合开发H5+ ...

最新文章

  1. c语言发送结构体 文件
  2. 学习笔记:文本过滤_____unix 下的通配符
  3. HTTPGet 与HTTPPost的区别
  4. C# winform 自定义皮肤制作
  5. cass生成曲线要素文件_几种常见的CASS字体异常问题,教你如何解决
  6. Exception 'ReflectionException' with message 'Class require does not exist'
  7. 给页面title添加图标
  8. Oracle 或关闭中国研发中心(CDC):裁员 1600 人
  9. 按键精灵打怪学习-自动寻路回打怪点
  10. Github中的缩写(PR, WIP, PTAL, TBR, TL, LGTM, SGTM, AFAIK, CC)含义
  11. Visual Studio Code (VS Code)安装教程(配图超详细)
  12. Android之获取地理位置
  13. magent java_bt种子简介与magnet磁力介绍
  14. C++编程易范错误集合
  15. 实验记录 | scATAC-seq数据的比对(一)
  16. seo优化:把百度放进数据库
  17. 什么标签用于在表单中构建复选框_目前艾滋病主要的传播方式是(  )。
  18. SQLSERVER 多表联合查询(join)
  19. dameware远程服务器进不去,DameWare无法远程网络控制故障的解决 -电脑资料
  20. 电感电容电解电容测量仪

热门文章

  1. JAVA,如何判断点是否在面内
  2. OpenResty概述
  3. java数组的初始化方式
  4. swoole 异步client redis TP5 微信模板消息 demo版本比较杂 代码注释啥的都没删除 但是可以用作为参考
  5. Android Error:Could not find lottie.jar
  6. 设计模式:给你生产一个女朋友---工厂方法模式
  7. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图...
  8. innodb_pool_buffer_size对innodb性能的影响
  9. Hadoop Hive
  10. CreateProcess 执行CMD命令,并重定向输出