一. 概念
JavaScriptCore框架
是苹果在iOS7引入的框架,该框架让 Objective-C 和 JavaScript 代码直接的交互变得更加的简单方便。
JavaScriptCore框架
其实就是基于 webkit 中以C/C++实现的JavaScriptCore
的一个包装
二. JavaScriptCore框架常用类
- JSContext: JS运行的环境, 为JS代码的执行提供了上下文环境, 并且通过JSContext获取JS的数据
- JSValue: 用于接受JS中获取的数据类型, 可以使对象, 方法
- JSManagedValue: 用来包装JSValue对象
- JSVirtualMachine: JavaScript虚拟机, 每一个JavaScript上下文(也就是一个JSContext对象)归属于一个虚拟机。每一个虚拟机可以包含多个不同的上下文,而且可以在不同的上下文之间传值(JSValue对象)。但是,每一个虚拟机都是独立的——你不能将在一个虚拟机中创建的值传到另一个虚拟机的一个上下文中
- JSExport: protocol,如果JS对象想直接调用OC对象里面的方法和属性,那么这个OC对象需要实现这个JSExport协议
js OC type 转换
Objective-C type | JavaScript type |
---|---|
nil | undefined |
NSNull | null |
NSString | string |
NSNumber | number, boolean |
NSDictionary | Object object |
NSArray | Array object |
NSDate | Date object |
NSBlock (1) | Function object (1) |
id (2) | Wrapper object (2) |
Class (3) | Constructor object (3) |
三. JS 和 OC 互调
必须创建JS运行环境
1. OC调用JS
本质: JS代码中已经定义好变量和方法, 用过OC去获取, 并且调用
步骤:
1. 创建JS运行环境
2. 执行JS代码
3. 获取JS数据(变量, 方法)
4. 使用JS数据, 方法
变量的调用
JSContext *context = [[JSContext alloc] init];
NSString *jsCode = @"let arr = [1, 2, 3]";
[context evaluateScript:jsCode];
// 只有执行JS代码才能获取数据
// 变量定义在JS中, 所以直接通过JSContext获取, 根据变量名称获取, 相当于字典的key
JSValue *reJsValue = context[@"arr"];
NSLog(@"%@", reJsValue); // 1,2,3
// 修改JS的值
reJsValue[0] = @9;