Skip to content

Commit 1be2ace

Browse files
authored
fix: removes listeners when app is reloaded on ios (#1878)
1 parent 39ece7c commit 1be2ace

2 files changed

Lines changed: 59 additions & 12 deletions

File tree

android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -178,19 +178,22 @@ private void removeObservers() {
178178
}
179179

180180
private void removeHandlers() {
181-
if (!oneSignalInitDone) {
182-
Logging.debug("OneSignal React-Native SDK not initialized yet. Could not remove handlers.", null);
183-
return;
181+
if (hasAddedInAppMessageClickListener) {
182+
OneSignal.getInAppMessages().removeClickListener(rnInAppClickListener);
183+
hasAddedInAppMessageClickListener = false;
184+
}
185+
if (hasAddedInAppMessageLifecycleListener) {
186+
OneSignal.getInAppMessages().removeLifecycleListener(rnInAppLifecycleListener);
187+
hasAddedInAppMessageLifecycleListener = false;
188+
}
189+
if (hasAddedNotificationClickListener) {
190+
OneSignal.getNotifications().removeClickListener(rnNotificationClickListener);
191+
hasAddedNotificationClickListener = false;
192+
}
193+
if (hasAddedNotificationForegroundListener) {
194+
OneSignal.getNotifications().removeForegroundLifecycleListener(this);
195+
hasAddedNotificationForegroundListener = false;
184196
}
185-
186-
OneSignal.getInAppMessages().removeClickListener(rnInAppClickListener);
187-
hasAddedInAppMessageClickListener = false;
188-
OneSignal.getInAppMessages().removeLifecycleListener(rnInAppLifecycleListener);
189-
hasAddedInAppMessageLifecycleListener = false;
190-
OneSignal.getNotifications().removeClickListener(rnNotificationClickListener);
191-
hasAddedNotificationClickListener = false;
192-
OneSignal.getNotifications().removeForegroundLifecycleListener(this);
193-
hasAddedNotificationForegroundListener = false;
194197
}
195198

196199
private void sendEvent(String eventName, Object params) {

ios/RCTOneSignal/RCTOneSignalEventEmitter.m

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ @implementation RCTOneSignalEventEmitter {
1919
}
2020

2121
static BOOL _didStartObserving = false;
22+
// Static reference to track current instance for cleanup on reload
23+
static RCTOneSignalEventEmitter *_currentInstance = nil;
2224

2325
+ (BOOL)hasSetBridge {
2426
return _didStartObserving;
@@ -48,6 +50,13 @@ - (instancetype)init {
4850
selector:@selector(emitEvent:)
4951
name:eventName
5052
object:nil];
53+
54+
// Clean up previous instance if it exists (handles reload scenario)
55+
if (_currentInstance != nil && _currentInstance != self) {
56+
[_currentInstance removeHandlers];
57+
[_currentInstance removeObservers];
58+
}
59+
_currentInstance = self;
5160
}
5261

5362
return self;
@@ -64,6 +73,8 @@ - (void)startObserving {
6473

6574
- (void)stopObserving {
6675
_hasListeners = false;
76+
[self removeHandlers];
77+
[self removeObservers];
6778
}
6879

6980
- (NSArray<NSString *> *)supportedEvents {
@@ -584,4 +595,37 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body {
584595
// iOS Stub
585596
}
586597

598+
- (void)removeObservers {
599+
[self removePermissionObserver];
600+
[self removePushSubscriptionObserver];
601+
[self removeUserStateObserver];
602+
}
603+
604+
- (void)removeHandlers {
605+
if (_hasAddedInAppMessageClickListener) {
606+
[OneSignal.InAppMessages removeClickListener:[RCTOneSignal sharedInstance]];
607+
_hasAddedInAppMessageClickListener = false;
608+
}
609+
if (_hasAddedInAppMessageLifecycleListener) {
610+
[OneSignal.InAppMessages
611+
removeLifecycleListener:[RCTOneSignal sharedInstance]];
612+
_hasAddedInAppMessageLifecycleListener = false;
613+
}
614+
if (_hasAddedNotificationClickListener) {
615+
[OneSignal.Notifications removeClickListener:[RCTOneSignal sharedInstance]];
616+
_hasAddedNotificationClickListener = false;
617+
}
618+
if (_hasAddedNotificationForegroundLifecycleListener) {
619+
[OneSignal.Notifications removeForegroundLifecycleListener:self];
620+
_hasAddedNotificationForegroundLifecycleListener = false;
621+
}
622+
}
623+
624+
- (void)removeUserStateObserver {
625+
if (_hasSetUserStateObserver) {
626+
[OneSignal.User removeObserver:[RCTOneSignal sharedInstance]];
627+
_hasSetUserStateObserver = false;
628+
}
629+
}
630+
587631
@end

0 commit comments

Comments
 (0)