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的運行環(huán)境睛约,他主要作用是執(zhí)行JS代碼和注冊O(shè)C方法接口捞高,相當于HTML中< JavaScript ></JavaScript >之間的內(nèi)容砸琅。
- JSValue是JSContext的返回結(jié)果迫摔,他對數(shù)據(jù)類型進行了封裝,并且為JS和OC的數(shù)據(jù)類型之間的轉(zhuǎn)換提供了方法汤踏。
- JSManagedValue是JSValue的封裝织鲸,用它可以解決JS和原生代碼之間循環(huán)引用的問題。
- JSVirtualMachine 管理JS運行時和管理JS暴露的OC對象的內(nèi)存溪胶。
- JSExport是一個協(xié)議搂擦,通過實現(xiàn)它可以把一個OC對象暴漏給JS,這樣JS就可以調(diào)用這個對象暴露的方法哗脖。
OC調(diào)用JS代碼
先看下面常見的三種情況瀑踢,之間執(zhí)行js代碼、執(zhí)行文件或網(wǎng)絡(luò)中的js代碼才避、注冊js方法再利用JSValue調(diào)用
//直接執(zhí)行js代碼
- (void)evaluateScript
{ //定義一個js并執(zhí)行函數(shù)
JSValue *exeFunction1 = [self.jsContext evaluateScript:@"function hi(){ return 'hi' }; hi()"];
//執(zhí)行一個閉包js
JSValue *exeFunction2 = [self.jsContext evaluateScript:@"(function(){ return 'hi' })()"];}
//執(zhí)行一段js文件中的代碼
//更多的應(yīng)用場景使用網(wǎng)絡(luò)或者本地文件加載一段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調(diào)用- (void)regiestJSFunction {
//注冊一個函數(shù)
[self.jsContext evaluateScript:@"var hello = function(){ return 'hello' }"];
//調(diào)用
JSValue *value1 = [self.jsContext evaluateScript:@"hello()"];
//注冊一個匿名函數(shù)
JSValue *jsFunction = [self.jsContext evaluateScript:@" (function(){ return 'hello objc' })"];
//調(diào)用 JSValue *value2 = [jsFunction callWithArguments:nil];}
如果返回的是一個函數(shù)類型桑逝,這可以使用 jsvalue callWithArguments
方法進行js函數(shù)調(diào)用徘钥,例如:
//注冊一個匿名函數(shù)
JSValue *jsFunction = [self.jsContext evaluateScript:@" (function() { return 'hello objc' })"];
//調(diào)用 JSValue *value2 = [jsFunction callWithArguments:nil];
js調(diào)用native代碼
//注冊js方法給Native調(diào)用- (void)regiestNativeFunction {
//注冊一個objc方法給js調(diào)用
self.jsContext[@"log"] = ^(NSString *msg){ NSLog(@"js:msg:%@",msg); };
//另一種方式,利用currentArguments獲取參數(shù) self.jsContext[@"log"] = ^() { NSArray *args = [JSContext currentArguments];
for (id obj in args)
{ NSLog(@"%@",obj);
}
};
//使用js調(diào)用objc [self.jsContext evaluateScript:@"log('hello,i am js side')"];
}