JavaScriptSore是苹果在iOS7之后提供的一套框架,它让JS与OC的交互更加简单方便。要使用JavaScriptCore首先我们需要引入它的头文件#import <JavaScriptCore/JavaScriptCore.h>
重要对象:
#import "JSContext.h"
#import "JSValue.h"
#import "JSManagedValue.h"
#import "JSVirtualMachine.h"
#import "JSExport.h"
- JSContext是JavaScript的运行环境,他主要作用是执行JS代码和注册OC方法接口,相当于HTML中< JavaScript ></JavaScript >之间的内容。
- JSValue是JSContext的返回结果,他对数据类型进行了封装,并且为JS和OC的数据类型之间的转换提供了方法。
- JSManagedValue是JSValue的封装,用它可以解决JS和原生代码之间循环引用的问题。
- JSVirtualMachine 管理JS运行时和管理JS暴露的OC对象的内存。
- JSExport是一个协议,通过实现它可以把一个OC对象暴漏给JS,这样JS就可以调用这个对象暴露的方法。
OC调用JS代码
先看下面常见的三种情况,之间执行js代码、执行文件或网络中的js代码、注册js方法再利用JSValue调用
//直接执行js代码
- (void)evaluateScript
{ //定义一个js并执行函数
JSValue *exeFunction1 = [self.jsContext evaluateScript:@"function hi(){ return 'hi' }; hi()"];
//执行一个闭包js
JSValue *exeFunction2 = [self.jsContext evaluateScript:@"(function(){ return 'hi' })()"];}
//执行一段js文件中的代码
//更多的应用场景使用网络或者本地文件加载一段js代码,充分利用其灵活性
- (void)evaluateScriptFromJSFile { NSString * path = [[NSBundle mainBundle] pathForResource:@"core" ofType:@"js"];
NSString * html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
JSValue *constructor = [self.jsContext evaluateScript:html];
}
//注册js方法,然后在利用JSValue调用- (void)regiestJSFunction {
//注册一个函数
[self.jsContext evaluateScript:@"var hello = function(){ return 'hello' }"];
//调用
JSValue *value1 = [self.jsContext evaluateScript:@"hello()"];
//注册一个匿名函数
JSValue *jsFunction = [self.jsContext evaluateScript:@" (function(){ return 'hello objc' })"];
//调用 JSValue *value2 = [jsFunction callWithArguments:nil];}
如果返回的是一个函数类型,这可以使用 jsvalue callWithArguments
方法进行js函数调用,例如:
//注册一个匿名函数
JSValue *jsFunction = [self.jsContext evaluateScript:@" (function() { return 'hello objc' })"];
//调用 JSValue *value2 = [jsFunction callWithArguments:nil];
js调用native代码
//注册js方法给Native调用- (void)regiestNativeFunction {
//注册一个objc方法给js调用
self.jsContext[@"log"] = ^(NSString *msg){ NSLog(@"js:msg:%@",msg); };
//另一种方式,利用currentArguments获取参数 self.jsContext[@"log"] = ^() { NSArray *args = [JSContext currentArguments];
for (id obj in args)
{ NSLog(@"%@",obj);
}
};
//使用js调用objc [self.jsContext evaluateScript:@"log('hello,i am js side')"];
}