From 7b5a540f508083330ee021bcc01d4bc09c6478f4 Mon Sep 17 00:00:00 2001 From: Carlos Nogueira Date: Wed, 30 Apr 2025 16:07:50 +0100 Subject: [PATCH] RUM-9753: fix event emitter call on invalid rn bridge reference --- packages/core/ios/Sources/DdSdk.h | 1 + packages/core/ios/Sources/DdSdk.mm | 10 ++++++++-- .../ios/Sources/DdSdkNativeInitialization.swift | 13 ++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/core/ios/Sources/DdSdk.h b/packages/core/ios/Sources/DdSdk.h index eb8f64184..2b8a652b6 100644 --- a/packages/core/ios/Sources/DdSdk.h +++ b/packages/core/ios/Sources/DdSdk.h @@ -24,5 +24,6 @@ @property(nonatomic, strong) DdSdkImplementation *ddSdkImplementation; + (void)initFromNative; ++ (RCTBridge * _Nullable)latestBridgeReference; @end diff --git a/packages/core/ios/Sources/DdSdk.mm b/packages/core/ios/Sources/DdSdk.mm index 7b9a1bb2e..4f6417294 100644 --- a/packages/core/ios/Sources/DdSdk.mm +++ b/packages/core/ios/Sources/DdSdk.mm @@ -14,7 +14,12 @@ @implementation DdSdk -@synthesize bridge = _bridge; +static __weak RCTBridge *s_latestBridge = nil; + ++ (RCTBridge *)latestBridgeReference { + return s_latestBridge; +} + RCT_EXPORT_MODULE() RCT_REMAP_METHOD(initialize, withConfiguration:(NSDictionary*)configuration @@ -105,7 +110,8 @@ @implementation DdSdk - (DdSdkImplementation*)ddSdkImplementation { if (_ddSdkImplementation == nil) { - _ddSdkImplementation = [[DdSdkImplementation alloc] initWithBridge:_bridge]; + s_latestBridge = self.bridge; + _ddSdkImplementation = [[DdSdkImplementation alloc] initWithBridge:self.bridge]; } return _ddSdkImplementation; } diff --git a/packages/core/ios/Sources/DdSdkNativeInitialization.swift b/packages/core/ios/Sources/DdSdkNativeInitialization.swift index b6534d04a..29ac7f242 100644 --- a/packages/core/ios/Sources/DdSdkNativeInitialization.swift +++ b/packages/core/ios/Sources/DdSdkNativeInitialization.swift @@ -151,7 +151,18 @@ public class DdSdkNativeInitialization: NSObject { } } let onSessionStart: RUM.SessionListener = { sessionId, isDiscarded in - let body: [String: Any?] = ["sessionId": sessionId, "isDiscarded": isDiscarded] + guard + let emitter = eventEmitter, + let bridge = emitter.bridge, + let latestBridge = DdSdk.latestBridgeReference(), + bridge === latestBridge + else { + return + } + + let body: [String: Any?] = [ + "sessionId": sessionId, "isDiscarded": isDiscarded, + ] eventEmitter?.sendEvent(withName: "RumSessionStarted", body: body) }