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 a6c53a46..93abb6fe 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,37 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { // iOS Stub } +- (void)removeObservers { + [self removePermissionObserver]; + [self removePushSubscriptionObserver]; + [self removeUserStateObserver]; +} + +- (void)removeHandlers { + 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 { + if (_hasSetUserStateObserver) { + [OneSignal.User removeObserver:[RCTOneSignal sharedInstance]]; + _hasSetUserStateObserver = false; + } +} + @end