From 3456c141b5d6d78bc5aced424ab64c2ecce49e13 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Mon, 5 May 2025 16:59:25 +0200 Subject: [PATCH] fix(react-native-host): notify when runtime is ready --- .changeset/calm-dingos-swim.md | 5 ++++ .../cocoa/RNXTurboModuleAdapter.mm | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 .changeset/calm-dingos-swim.md diff --git a/.changeset/calm-dingos-swim.md b/.changeset/calm-dingos-swim.md new file mode 100644 index 0000000000..b146aa8d60 --- /dev/null +++ b/.changeset/calm-dingos-swim.md @@ -0,0 +1,5 @@ +--- +"@rnx-kit/react-native-host": patch +--- + +Post a notification when the React runtime is ready diff --git a/packages/react-native-host/cocoa/RNXTurboModuleAdapter.mm b/packages/react-native-host/cocoa/RNXTurboModuleAdapter.mm index 6e152bf5ad..fc72123c80 100644 --- a/packages/react-native-host/cocoa/RNXTurboModuleAdapter.mm +++ b/packages/react-native-host/cocoa/RNXTurboModuleAdapter.mm @@ -53,12 +53,26 @@ @implementation RNXTurboModuleAdapter { #if USE_FABRIC RCTTurboModuleManager *_turboModuleManager; + std::weak_ptr _jsInvoker; #endif // USE_FABRIC #if USE_RUNTIME_SCHEDULER std::shared_ptr _runtimeScheduler; #endif // USE_RUNTIME_SCHEDULER } +#if USE_FABRIC +- (instancetype)init +{ + if (self = [super init]) { + [NSNotificationCenter.defaultCenter addObserver:self + selector:@selector(onRuntimeReady:) + name:@"RCTInstanceDidLoadBundle" + object:nil]; + } + return self; +} +#endif // USE_FABRIC + - (std::unique_ptr)jsExecutorFactoryForBridge: (RCTBridge *)bridge { @@ -90,6 +104,7 @@ - (Class)getModuleClassFromName:(char const *)name jsInvoker:(std::shared_ptr)jsInvoker { #if __has_include() // >= 0.75 + _jsInvoker = jsInvoker; return facebook::react::DefaultTurboModules::getTurboModule(name, jsInvoker); #else return nullptr; @@ -127,6 +142,18 @@ - (Class)getModuleClassFromName:(char const *)name #endif // USE_RUNTIME_SCHEDULER } +- (void)onRuntimeReady:(NSNotification *)note +{ + if (auto jsInvoker = _jsInvoker.lock()) { + jsInvoker->invokeAsync([](facebook::jsi::Runtime &runtime) { + NSDictionary *userInfo = @{@"runtime": [NSValue valueWithPointer:&runtime]}; + [NSNotificationCenter.defaultCenter postNotificationName:@"ReactAppRuntimeReady" + object:nil + userInfo:userInfo]; + }); + } +} + #endif // USE_FABRIC @end