From 6bee3911e3d9a55bb0d012fe693cd947f6687826 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 9 Dec 2025 16:57:39 -0800 Subject: [PATCH 1/3] add same current instance logic for ios event emitter --- ios/RCTOneSignal/RCTOneSignalEventEmitter.m | 35 +++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m index a6c53a46..d4e74b5f 100644 --- a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m +++ b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m @@ -19,6 +19,8 @@ @implementation RCTOneSignalEventEmitter { } static BOOL _didStartObserving = false; +// Static reference to track current instance for cleanup on reload +static RCTOneSignalEventEmitter *_currentInstance = nil; + (BOOL)hasSetBridge { return _didStartObserving; @@ -48,6 +50,13 @@ - (instancetype)init { selector:@selector(emitEvent:) name:eventName object:nil]; + + // Clean up previous instance if it exists (handles reload scenario) + if (_currentInstance != nil && _currentInstance != self) { + [_currentInstance removeHandlers]; + [_currentInstance removeObservers]; + } + _currentInstance = self; } return self; @@ -64,6 +73,8 @@ - (void)startObserving { - (void)stopObserving { _hasListeners = false; + [self removeHandlers]; + [self removeObservers]; } - (NSArray *)supportedEvents { @@ -584,4 +595,28 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { // iOS Stub } +- (void)removeObservers { + [self removePermissionObserver]; + [self removePushSubscriptionObserver]; + [self removeUserStateObserver]; +} + +- (void)removeHandlers { + [OneSignal.InAppMessages removeClickListener:[RCTOneSignal sharedInstance]]; + _hasAddedInAppMessageClickListener = false; + [OneSignal.InAppMessages removeLifecycleListener:[RCTOneSignal sharedInstance]]; + _hasAddedInAppMessageLifecycleListener = false; + [OneSignal.Notifications removeClickListener:[RCTOneSignal sharedInstance]]; + _hasAddedNotificationClickListener = false; + [OneSignal.Notifications removeForegroundLifecycleListener:self]; + _hasAddedNotificationForegroundLifecycleListener = false; +} + +- (void)removeUserStateObserver { + if (_hasSetUserStateObserver) { + [OneSignal.User removeObserver:[RCTOneSignal sharedInstance]]; + _hasSetUserStateObserver = false; + } +} + @end From adc2006c60183b123146e62e7b028b3b55ddca46 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 9 Dec 2025 17:08:26 -0800 Subject: [PATCH 2/3] fix formatting --- ios/RCTOneSignal/RCTOneSignalEventEmitter.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m index d4e74b5f..47946079 100644 --- a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m +++ b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m @@ -604,7 +604,8 @@ - (void)removeObservers { - (void)removeHandlers { [OneSignal.InAppMessages removeClickListener:[RCTOneSignal sharedInstance]]; _hasAddedInAppMessageClickListener = false; - [OneSignal.InAppMessages removeLifecycleListener:[RCTOneSignal sharedInstance]]; + [OneSignal.InAppMessages + removeLifecycleListener:[RCTOneSignal sharedInstance]]; _hasAddedInAppMessageLifecycleListener = false; [OneSignal.Notifications removeClickListener:[RCTOneSignal sharedInstance]]; _hasAddedNotificationClickListener = false; From a97f1192c8355dec6ebd6d7a93d6bca7f3912a1b Mon Sep 17 00:00:00 2001 From: Fadi George Date: Wed, 10 Dec 2025 12:52:31 -0800 Subject: [PATCH 3/3] clean up remove handlers logic --- .../rnonesignalandroid/RNOneSignal.java | 27 ++++++++++--------- ios/RCTOneSignal/RCTOneSignalEventEmitter.m | 26 +++++++++++------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index 6e98d993..2b5c8ea7 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -178,19 +178,22 @@ private void removeObservers() { } private void removeHandlers() { - if (!oneSignalInitDone) { - Logging.debug("OneSignal React-Native SDK not initialized yet. Could not remove handlers.", null); - return; + if (hasAddedInAppMessageClickListener) { + OneSignal.getInAppMessages().removeClickListener(rnInAppClickListener); + hasAddedInAppMessageClickListener = false; + } + if (hasAddedInAppMessageLifecycleListener) { + OneSignal.getInAppMessages().removeLifecycleListener(rnInAppLifecycleListener); + hasAddedInAppMessageLifecycleListener = false; + } + if (hasAddedNotificationClickListener) { + OneSignal.getNotifications().removeClickListener(rnNotificationClickListener); + hasAddedNotificationClickListener = false; + } + if (hasAddedNotificationForegroundListener) { + OneSignal.getNotifications().removeForegroundLifecycleListener(this); + hasAddedNotificationForegroundListener = false; } - - OneSignal.getInAppMessages().removeClickListener(rnInAppClickListener); - hasAddedInAppMessageClickListener = false; - OneSignal.getInAppMessages().removeLifecycleListener(rnInAppLifecycleListener); - hasAddedInAppMessageLifecycleListener = false; - OneSignal.getNotifications().removeClickListener(rnNotificationClickListener); - hasAddedNotificationClickListener = false; - OneSignal.getNotifications().removeForegroundLifecycleListener(this); - hasAddedNotificationForegroundListener = false; } private void sendEvent(String eventName, Object params) { diff --git a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m index 47946079..93abb6fe 100644 --- a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m +++ b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m @@ -602,15 +602,23 @@ - (void)removeObservers { } - (void)removeHandlers { - [OneSignal.InAppMessages removeClickListener:[RCTOneSignal sharedInstance]]; - _hasAddedInAppMessageClickListener = false; - [OneSignal.InAppMessages - removeLifecycleListener:[RCTOneSignal sharedInstance]]; - _hasAddedInAppMessageLifecycleListener = false; - [OneSignal.Notifications removeClickListener:[RCTOneSignal sharedInstance]]; - _hasAddedNotificationClickListener = false; - [OneSignal.Notifications removeForegroundLifecycleListener:self]; - _hasAddedNotificationForegroundLifecycleListener = false; + if (_hasAddedInAppMessageClickListener) { + [OneSignal.InAppMessages removeClickListener:[RCTOneSignal sharedInstance]]; + _hasAddedInAppMessageClickListener = false; + } + if (_hasAddedInAppMessageLifecycleListener) { + [OneSignal.InAppMessages + removeLifecycleListener:[RCTOneSignal sharedInstance]]; + _hasAddedInAppMessageLifecycleListener = false; + } + if (_hasAddedNotificationClickListener) { + [OneSignal.Notifications removeClickListener:[RCTOneSignal sharedInstance]]; + _hasAddedNotificationClickListener = false; + } + if (_hasAddedNotificationForegroundLifecycleListener) { + [OneSignal.Notifications removeForegroundLifecycleListener:self]; + _hasAddedNotificationForegroundLifecycleListener = false; + } } - (void)removeUserStateObserver {