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