JavaScriptCore 的使用

JavaScriptSore是苹果在iOS7之后提供的一套框架,它让JS与OC的交互更加简单方便。要使用JavaScriptCore首先我们需要引入它的头文件#import

重要对象:

#import "JSContext.h"
#import "JSValue.h"
#import "JSManagedValue.h"
#import "JSVirtualMachine.h"
#import "JSExport.h"
  • JSContext是JavaScript的运行环境,他主要作用是执行JS代码和注册OC方法接口,相当于HTML中< 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')"];
}

你可能感兴趣的:(JavaScriptCore 的使用)