首页 技术 正文
技术 2022年11月14日
0 收藏 377 点赞 4,088 浏览 2167 个字

JavaScriptCore 时代的通讯

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

JavaScriptCore 中 OC 调用 JS 方法

在 JS 中定义一个方法

123 function alertFunc() {window.alert(“这是一个JS中的弹框!”)}

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

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

123456789 – (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 方法。

12345678 – (IBAction)buttonClick:(UIButton *)sender {if (!self.context) {return;} JSValue *funcValue = self.context[@”alertFunc”];[funcValue callWithArguments:nil];}

点击按钮时,效果如下。

JS和OC间的通信(使用JavaScriptCore)

实现了 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即可)。

12345678910111213 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 onclick=”ocAlert()”>点击这里</button>

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

JS和OC间的通信(使用JavaScriptCore)

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

是不是方便了很多?

写在后面

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

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

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898