Native API的实现

v0.67.3

Native API

js能够调用的native api都实现RCTBridgeModule协议

// Implemented by RCT_EXPORT_MODULE
+ (NSString *)moduleName; // 必须实现,通过RCT_EXPORT_MODULE实现

@property (nonatomic, strong, readonly) dispatch_queue_t methodQueue;

在implementation里会调用宏RCT_EXPORT_MODULE

#define RCT_EXPORT_MODULE(js_name)          \
  RCT_EXTERN void RCTRegisterModule(Class); \
  +(NSString *)moduleName                   \
  {                                         \
    return @ #js_name;                      \
  }                                         \
  +(void)load                               \
  {                                         \
    RCTRegisterModule(self);                \
  }

js_name是可选,实现了RCT_EXPORT_MODULE,会在load的时候注册该module

resolve/reject

resolve调用 resolve -> RCTCxxBridge enqueueCallback->Instance::callJSCallback->NativeToJsBridge::invokeCallback->JSIExecutor::invokeCallback->jsi::Runtime

注册模块

RCTRegisterModule的注册,由一个数组RCTModuleClasses管理

通过RCTGetModuleClasses方法读取数组,在CxxBridge start的地方处理

(void)[self _initializeModules:RCTGetModuleClasses() withDispatchGroup:prepareBridge lazilyDiscovered:NO];

支持懒加载

RCTClipboard会被包装成RCTModuleData,分别加入到字典_moduleDataByName和数组_moduleDataByID,数组_moduleClassesByID会保存moduleClass

invoke

普通调用,如ScreenshotManager

js侧 ScreenshotManager.takeScreenshot->调用到NativeModules.js 中genMethod为其生成的方法中,NativeModules->然后调用MessageQueue.js BatchedBridge.enqueueNativeCall->最后调用5ms一次的nativeFlushQueueImmediate

来自js侧nativeFlushQueueImmediate调用->JSIExecutor::callNativeModules->JstoNativeBridge callNativeModules -> ModuleRegistry::callNativeMethod->RCTNativeModule::invoke -> RCTModuleMethod invokeWithBridge->ScreenshotManager takeScreenshot

callNativeModules是批量执行方法调用,里面会分别调用callNativeMethod

codegen的调用

jsi::Value ObjCTurboModule::invokeObjCMethod→jsi::Value ObjCTurboModule::performMethodInvocation→RCTVibration vibrate

JS侧API

具体的实现在NativeModules.js,主要有genModule、loadModule、genMethod三个方法

const ScreenshotManager = NativeModules.ScreenshotManager;

在载入NativeModules.js的流程中, NativeModules本质是一个map

  • 给NativeModules的每一个item赋值
  • 遍历__fbBatchedBridgeConfig的module 配置,这个是native注入的
  • 根据每一个module config,调用genModule,生成对应的module map
    • 根据config的methods,调用genMethod,给module map 赋值,key为method name,value是function,调用BatchedBridge.enqueueNativeCall / callNativeSyncHook
  • 复制给NativeModules对应的item,key为moduleName

results matching ""

    No results matching ""