From ece6e02e3f8542f9aac575aec58ea0dcb4f32800 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 9 Dec 2025 09:59:30 -0800 Subject: [PATCH 1/3] fix removing of listeners on app reload --- .../rnonesignalandroid/RNOneSignal.java | 37 +++++++++++++------ examples/RNOneSignalTS/ios/Podfile.lock | 2 +- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index 332ad64a..f5732b68 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -96,6 +96,9 @@ public class RNOneSignal extends ReactContextBaseJavaModule private boolean hasAddedNotificationClickListener = false; private boolean hasAddedInAppMessageClickListener = false; + // Static reference to track current instance for cleanup on reload + private static RNOneSignal currentInstance = null; + private IInAppMessageClickListener rnInAppClickListener = new IInAppMessageClickListener() { @Override public void onClick(IInAppMessageClickEvent event) { @@ -175,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) { @@ -203,6 +209,13 @@ public RNOneSignal(ReactApplicationContext reactContext) { mReactContext.addLifecycleEventListener(this); notificationWillDisplayCache = new HashMap(); preventDefaultCache = new HashMap(); + + // Clean up previous instance if it exists (handles reload scenario) + if (currentInstance != null && currentInstance != this) { + currentInstance.removeHandlers(); + currentInstance.removeObservers(); + } + currentInstance = this; } /** Native Module Overrides */ diff --git a/examples/RNOneSignalTS/ios/Podfile.lock b/examples/RNOneSignalTS/ios/Podfile.lock index f5dcb5fc..af15b3d0 100644 --- a/examples/RNOneSignalTS/ios/Podfile.lock +++ b/examples/RNOneSignalTS/ios/Podfile.lock @@ -2665,7 +2665,7 @@ SPEC CHECKSUMS: React-logger: a3cb5b29c32b8e447b5a96919340e89334062b48 React-Mapbuffer: 9d2434a42701d6144ca18f0ca1c4507808ca7696 React-microtasksnativemodule: 75b6604b667d297292345302cc5bfb6b6aeccc1b - react-native-onesignal: 6c5758aa56975db4bca9956d18d83dd62444c931 + react-native-onesignal: b68c981956150f288c1585889871affcef3c0b8b react-native-safe-area-context: c00143b4823773bba23f2f19f85663ae89ceb460 React-NativeModulesApple: 879fbdc5dcff7136abceb7880fe8a2022a1bd7c3 React-oscompat: 93b5535ea7f7dff46aaee4f78309a70979bdde9d From c0d925af026f6941960abdc777903221954b33f5 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 9 Dec 2025 10:47:23 -0800 Subject: [PATCH 2/3] clean up hooks --- .../rnonesignalandroid/RNOneSignal.java | 16 ++++++++-------- examples/RNOneSignalTS/OSDemo.tsx | 15 ++++++--------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index f5732b68..2b5c8ea7 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -179,20 +179,20 @@ private void removeObservers() { private void removeHandlers() { if (hasAddedInAppMessageClickListener) { - OneSignal.getInAppMessages().removeClickListener(rnInAppClickListener); - hasAddedInAppMessageClickListener = false; + OneSignal.getInAppMessages().removeClickListener(rnInAppClickListener); + hasAddedInAppMessageClickListener = false; } if (hasAddedInAppMessageLifecycleListener) { - OneSignal.getInAppMessages().removeLifecycleListener(rnInAppLifecycleListener); - hasAddedInAppMessageLifecycleListener = false; + OneSignal.getInAppMessages().removeLifecycleListener(rnInAppLifecycleListener); + hasAddedInAppMessageLifecycleListener = false; } if (hasAddedNotificationClickListener) { - OneSignal.getNotifications().removeClickListener(rnNotificationClickListener); - hasAddedNotificationClickListener = false; + OneSignal.getNotifications().removeClickListener(rnNotificationClickListener); + hasAddedNotificationClickListener = false; } if (hasAddedNotificationForegroundListener) { - OneSignal.getNotifications().removeForegroundLifecycleListener(this); - hasAddedNotificationForegroundListener = false; + OneSignal.getNotifications().removeForegroundLifecycleListener(this); + hasAddedNotificationForegroundListener = false; } } diff --git a/examples/RNOneSignalTS/OSDemo.tsx b/examples/RNOneSignalTS/OSDemo.tsx index b65a125a..3eccd7f5 100644 --- a/examples/RNOneSignalTS/OSDemo.tsx +++ b/examples/RNOneSignalTS/OSDemo.tsx @@ -135,16 +135,13 @@ const OSDemo: React.FC = () => { ); useEffect(() => { - const initializeOneSignal = async () => { - OneSignal.initialize(APP_ID); - OneSignal.Debug.setLogLevel(LogLevel.None); + OneSignal.initialize(APP_ID); + OneSignal.Debug.setLogLevel(LogLevel.None); + }, []); + useEffect(() => { + const setup = async () => { OneSignal.LiveActivities.setupDefault(); - // OneSignal.LiveActivities.setupDefault({ - // enablePushToStart: false, - // enablePushToUpdate: true, - // }); - OneSignal.Notifications.addEventListener( 'foregroundWillDisplay', onForegroundWillDisplay, @@ -166,7 +163,7 @@ const OSDemo: React.FC = () => { OneSignal.User.addEventListener('change', onUserChange); }; - initializeOneSignal(); + setup(); return () => { // Clean up all event listeners From 0a96b2950a81280290171c2ceacdcf7c76a1be4c Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 9 Dec 2025 12:08:30 -0800 Subject: [PATCH 3/3] remove handler change --- .../rnonesignalandroid/RNOneSignal.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index 2b5c8ea7..6e98d993 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -178,22 +178,19 @@ private void removeObservers() { } private void removeHandlers() { - 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; + if (!oneSignalInitDone) { + Logging.debug("OneSignal React-Native SDK not initialized yet. Could not remove handlers.", null); + return; } + + 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) {