一、引言
不扯虛的程剥,主要在于iOS的JavaScript引擎庫的使用,這里推薦## April Peng翻譯的老外教程浮声,很干貨
二睬塌、iOS調(diào)用JS代碼
2.1 加入JavaScriptCore庫
加入代碼
#import <JavaScriptCore/JavaScriptCore.h>
2.2 簡單上手:JSContext / JSValue
JSContext *context = [[JSContext alloc] init];
[context evaluateScript:@"var num = 1+4"];
[context evaluateScript:@"var names = ['Will', 'Arenas', 'James']"];
[context evaluateScript:@"var triple = function(value){return value * 3}"];
JSValue *tripleNum = [context evaluateScript:@"triple(num)"];
NSLog(@"r:%d", tripleNum.toInt32);
JSContext用于執(zhí)行JS代碼塊
JSValue用于拿到JS里的變量值嘿棘、函數(shù)嵌牺、以及函數(shù)執(zhí)行結(jié)果议慰,比較全能啦
2.3 獲取JS里數(shù)組里某個元素
JSValue *names = context[@"names"];
JSValue *firstName = names[0];
NSLog(@"r:%@", firstName.toString);
2.4 JS函數(shù)傳入OC寫的參數(shù)
JSValue *tripleFunc = context[@"triple"];
JSValue *result = [tripleFunc callWithArguments:@[@5]];
NSLog(@"r:%d", result.toInt32);
callWithArguments用于傳入多個\單個參數(shù)
2.5 錯誤處理
context.exceptionHandler = ^(JSContext *context, JSValue *exception) {
NSLog(@"JS Error:%@", exception);
};
[context evaluateScript:@"function mul(value1, value2){return value1 * value2"];
打印如下
附注:JSValue導(dǎo)出結(jié)果
三蒙保、JS調(diào)用iOS代碼
3.1 方法一:通過block
context[@"sayHello"] = ^(NSString *string){
return [NSString stringWithFormat:@"Hello %@", string];
};
JSValue *result = [context evaluateScript:@"sayHello('Will')"];
NSLog(@"r:%@", result.toString);
JavaScriptCore 會自動的把 block 封裝在 JavaScript 函數(shù)里辕棚,確實(shí)是牛逼
3.2 方法二:通過JSExport 協(xié)議
四、RN是如何解析JS的
那么問題來了邓厕,RN是怎么做的呢逝嚎,很明顯蘋果JavascriptCore提供的block或者JSExport不能滿足RN,RN自定義了一套JS與OC通信協(xié)議(RCTJSExecutor)邑狸,只是用了JavascriptCore作為解析引擎懈糯,確實(shí)吊