Skip to content

Latest commit

 

History

History
90 lines (63 loc) · 3.33 KB

native-to-js-ios.md

File metadata and controls

90 lines (63 loc) · 3.33 KB

iOS 原生与 JS 互相调用

Java​Script​Core

  • JSContext 是 JavaScript 的运行上下文,他主要作用是执行js代码和注册native方法接口
  • JSValue 是 JSContext 执行后的返回结果,他可以是任何js类型(比如基本数据类型和函数类型,对象类型等),并且都有对象的方法转换为native对象。
  • JSManagedValue 是JSValue的封装,用它可以解决js和原声代码之间循环引用的问题
  • JSVirtualMachine 管理JS运行时和管理js暴露的native对象的内存
  • JSExport 是一个协议,通过实现它可以完成把一个native对象暴漏给js

原生调用 JS 函数

JSValue *tripleFunction = context[@"triple"];
JSValue *result = [tripleFunction callWithArguments:@[@5] ];
NSLog(@"Five tripled: %d", [result toInt32]);

JS 调用原生 block

context[@"simplifyString"] = ^(NSString *input) {
   NSMutableString *mutableString = [input mutableCopy];
   CFStringTransform((__bridge CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, NO);
   CFStringTransform((__bridge CFMutableStringRef)mutableString, NULL, kCFStringTransformStripCombiningMarks, NO);
   return mutableString;
};

NSLog(@"%@", [context evaluateScript:@"simplifyString('안녕하새요!')"]);

调试

Other

JavaScriptCore API是线程安全的,比如:我们能够在任意线程创建一个JSValue对象,或者执行script(evaluate scripts),所有其他的线程尝试使用相同的虚拟机都将进行等待。为了执行JavaScript多线程的并发,为每一个线程使用一个独立的 JSVirtualMachine。

References

React Native 与 Java​Script​Core

in RCTCxxBridge.m

- (JSValue *)callFunctionOnModule:(NSString *)module
                           method:(NSString *)method
                        arguments:(NSArray *)arguments
                            error:(NSError **)error;

in JSCWrapper.h of jschelper

#include <JavaScriptCore/JavaScript.h>
JSC_WRAPPER_METHOD(JSEvaluateScript);

in JSBase.h

JS_EXPORT JSValueRef JSEvaluateScript(JSContextRef ctx, JSStringRef script, JSObjectRef thisObject, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception);

RCTBridge