diff --git a/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules+NewArch.mm b/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules+NewArch.mm index 2086ac31b3..c9cbdfa584 100644 --- a/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules+NewArch.mm +++ b/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules+NewArch.mm @@ -23,6 +23,10 @@ @interface NativeNitroModules () @end +// Captured once when RN decorates this module at startup; lets any Nitro +// HybridObject reach sibling RN modules on iOS via +sharedModuleRegistry. +static RCTModuleRegistry* gNitroSharedModuleRegistry = nil; + /** * NativeNitroModules implementation for the new architecture. * This uses `installJSIBindingsWithRuntime:` to install the `global.NitroModulesProxy` into the JS Runtime. @@ -31,9 +35,21 @@ @implementation NativeNitroModules { bool _didInstall; NSString* _Nullable _errorMessage; std::weak_ptr _callInvoker; + __weak RCTModuleRegistry* _moduleRegistry; } RCT_EXPORT_MODULE(NitroModules) +- (RCTModuleRegistry*)moduleRegistry { + return _moduleRegistry; +} +- (void)setModuleRegistry:(RCTModuleRegistry*)moduleRegistry { + _moduleRegistry = moduleRegistry; + gNitroSharedModuleRegistry = moduleRegistry; +} ++ (nullable RCTModuleRegistry*)sharedModuleRegistry { + return gNitroSharedModuleRegistry; +} + - (void)installJSIBindingsWithRuntime:(jsi::Runtime&)runtime { // 1. Get CallInvoker we cached statically std::shared_ptr callInvoker = _callInvoker.lock(); diff --git a/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules+OldArch.mm b/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules+OldArch.mm index e9202c7681..bb232bff85 100644 --- a/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules+OldArch.mm +++ b/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules+OldArch.mm @@ -24,13 +24,30 @@ - (void*)runtime; - (std::shared_ptr)jsCallInvoker; @end +// Captured when RN decorates this module; lets any Nitro HybridObject reach +// sibling RN modules on iOS via +sharedModuleRegistry. +static RCTModuleRegistry* gNitroSharedModuleRegistry = nil; + /** * NativeNitroModules implementation for the old architecture. * This uses `RCTBridge` to grab the `jsi::Runtime` and `react::CallInvoker`. */ -@implementation NativeNitroModules +@implementation NativeNitroModules { + __weak RCTModuleRegistry* _moduleRegistry; +} RCT_EXPORT_MODULE(NitroModules) +- (RCTModuleRegistry*)moduleRegistry { + return _moduleRegistry; +} +- (void)setModuleRegistry:(RCTModuleRegistry*)moduleRegistry { + _moduleRegistry = moduleRegistry; + gNitroSharedModuleRegistry = moduleRegistry; +} ++ (nullable RCTModuleRegistry*)sharedModuleRegistry { + return gNitroSharedModuleRegistry; +} + RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) { try { // 1. Cast RCTBridge to a RCTCxxBridge (ObjC) diff --git a/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules.h b/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules.h index cd7a5f063f..87b817c4d7 100644 --- a/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules.h +++ b/packages/react-native-nitro-modules/ios/turbomodule/NativeNitroModules.h @@ -5,18 +5,27 @@ // Created by Marc Rousavy on 07.10.24. // +// RCTModuleRegistry + the moduleRegistry property that RN injects into bridge modules. +#import + #ifdef RCT_NEW_ARCH_ENABLED // New Architecture uses the Codegen'd Spec (TurboModule) #import @interface NativeNitroModules : NSObject +@property (nonatomic, weak) RCTModuleRegistry *moduleRegistry; +/// The RCTModuleRegistry RN injected into this module, captured so any Nitro +/// HybridObject can reach sibling RN modules on iOS (analog of Android's applicationContext). ++ (nullable RCTModuleRegistry *)sharedModuleRegistry; @end #else // Old Architecture is an untyped RCTBridgeModule -#import @interface NativeNitroModules : NSObject +@property (nonatomic, weak) RCTModuleRegistry *moduleRegistry; +/// See above. ++ (nullable RCTModuleRegistry *)sharedModuleRegistry; @end #endif