From f6f2e6f3131afad527fca1d76116970748cb7aea Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 16 Dec 2025 15:14:53 -0800 Subject: [PATCH 1/6] demo changes for testing --- examples/RNOneSignalTS/OSDemo.tsx | 81 ++++++++++++++++++------------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/examples/RNOneSignalTS/OSDemo.tsx b/examples/RNOneSignalTS/OSDemo.tsx index 3b3813f5..da0048ca 100644 --- a/examples/RNOneSignalTS/OSDemo.tsx +++ b/examples/RNOneSignalTS/OSDemo.tsx @@ -1,7 +1,6 @@ import { useFocusEffect } from '@react-navigation/native'; import React, { useCallback, useEffect, useState } from 'react'; import { - Alert, ScrollView, StyleSheet, Text, @@ -9,7 +8,11 @@ import { TouchableOpacity, View, } from 'react-native'; -import { LogLevel, OneSignal } from 'react-native-onesignal'; +import { + LogLevel, + NotificationWillDisplayEvent, + OneSignal, +} from 'react-native-onesignal'; import { SafeAreaView } from 'react-native-safe-area-context'; import OSButtons from './OSButtons'; import OSConsole from './OSConsole'; @@ -37,40 +40,49 @@ const OSDemo: React.FC = () => { }, []); const onForegroundWillDisplay = useCallback( - (event: unknown) => { - OSLog('OneSignal: notification will show in foreground:', event); - const notif = ( - event as { getNotification: () => { title: string } } - ).getNotification(); - - const cancelButton = { - text: 'Cancel', - onPress: () => { - (event as { preventDefault: () => void }).preventDefault(); - }, - style: 'cancel' as const, - }; - - const completeButton = { - text: 'Display', - onPress: () => { - (event as { getNotification: () => { display: () => void } }) - .getNotification() - .display(); - }, - }; + (event: NotificationWillDisplayEvent) => { + console.log('OneSignal: notification will show in foreground:', event); - Alert.alert( - 'Display notification?', - notif.title, - [cancelButton, completeButton], - { - cancelable: true, - }, - ); + // console.log('Preventing display'); + // event.preventDefault(); }, - [OSLog], + [], ); + // const onForegroundWillDisplay = useCallback( + // (event: unknown) => { + // OSLog('OneSignal: notification will show in foreground:', event); + // // const notif = ( + // // event as { getNotification: () => { title: string } } + // // ).getNotification(); + + // // const cancelButton = { + // // text: 'Cancel', + // // onPress: () => { + // // (event as { preventDefault: () => void }).preventDefault(); + // // }, + // // style: 'cancel' as const, + // // }; + + // // const completeButton = { + // // text: 'Display', + // // onPress: () => { + // // (event as { getNotification: () => { display: () => void } }) + // // .getNotification() + // // .display(); + // // }, + // // }; + + // // Alert.alert( + // // 'Display notification?', + // // notif.title, + // // [cancelButton, completeButton], + // // { + // // cancelable: true, + // // }, + // // ); + // }, + // [OSLog], + // ); const onNotificationClick = useCallback( (event: unknown) => { @@ -145,6 +157,8 @@ const OSDemo: React.FC = () => { console.log('Setting up event listeners'); const setup = async () => { + const externalID = await OneSignal.User.getExternalId(); + console.log('External ID:', externalID); OneSignal.LiveActivities.setupDefault(); OneSignal.Notifications.addEventListener( 'foregroundWillDisplay', @@ -173,6 +187,7 @@ const OSDemo: React.FC = () => { OneSignal.User.addEventListener('change', onUserChange); }; + console.log('Setup'); setup(); return () => { From 001ddf07fb99bdf9dde388227a80b8d7097c7556 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 16 Dec 2025 15:57:40 -0800 Subject: [PATCH 2/6] android wip --- .../rnonesignalandroid/RNOneSignal.java | 24 ++++++++- examples/RNOneSignalTS/OSDemo.tsx | 52 ++----------------- 2 files changed, 28 insertions(+), 48 deletions(-) diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index 35b3a059..30115563 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -378,6 +378,7 @@ public void addNotificationForegroundLifecycleListener() { public void onWillDisplay(INotificationWillDisplayEvent event) { if (!this.hasAddedNotificationForegroundListener) { event.getNotification().display(); + return; } INotification notification = event.getNotification(); @@ -396,6 +397,12 @@ public void onWillDisplay(INotificationWillDisplayEvent event) { event.wait(); } } + + // If notification wasn't prevented, display it automatically + if (!preventDefaultCache.containsKey(notificationId)) { + event.getNotification().display(); + notificationWillDisplayCache.remove(notificationId); + } } catch (InterruptedException e) { Logging.error("InterruptedException: " + e.toString(), null); } @@ -412,7 +419,15 @@ private void displayNotification(String notificationId) { "Could not find onWillDisplayNotification event for notification with id: " + notificationId, null); return; } + + // Notify waiting thread and clean up caches + synchronized (event) { + preventDefaultCache.remove(notificationId); + event.notify(); + } + event.getNotification().display(); + notificationWillDisplayCache.remove(notificationId); } @ReactMethod @@ -424,7 +439,14 @@ private void preventDefault(String notificationId) { return; } event.preventDefault(); - this.preventDefaultCache.put(notificationId, event); + + // Add to cache and notify waiting thread + synchronized (event) { + this.preventDefaultCache.put(notificationId, event); + event.notify(); + } + + notificationWillDisplayCache.remove(notificationId); } @ReactMethod diff --git a/examples/RNOneSignalTS/OSDemo.tsx b/examples/RNOneSignalTS/OSDemo.tsx index da0048ca..a2bbdf3f 100644 --- a/examples/RNOneSignalTS/OSDemo.tsx +++ b/examples/RNOneSignalTS/OSDemo.tsx @@ -48,41 +48,6 @@ const OSDemo: React.FC = () => { }, [], ); - // const onForegroundWillDisplay = useCallback( - // (event: unknown) => { - // OSLog('OneSignal: notification will show in foreground:', event); - // // const notif = ( - // // event as { getNotification: () => { title: string } } - // // ).getNotification(); - - // // const cancelButton = { - // // text: 'Cancel', - // // onPress: () => { - // // (event as { preventDefault: () => void }).preventDefault(); - // // }, - // // style: 'cancel' as const, - // // }; - - // // const completeButton = { - // // text: 'Display', - // // onPress: () => { - // // (event as { getNotification: () => { display: () => void } }) - // // .getNotification() - // // .display(); - // // }, - // // }; - - // // Alert.alert( - // // 'Display notification?', - // // notif.title, - // // [cancelButton, completeButton], - // // { - // // cancelable: true, - // // }, - // // ); - // }, - // [OSLog], - // ); const onNotificationClick = useCallback( (event: unknown) => { @@ -157,8 +122,12 @@ const OSDemo: React.FC = () => { console.log('Setting up event listeners'); const setup = async () => { + // OneSignal.login('fadi-rna-11'); + const onesignalID = await OneSignal.User.getOnesignalId(); + console.log('OneSignal ID:', onesignalID); const externalID = await OneSignal.User.getExternalId(); console.log('External ID:', externalID); + OneSignal.LiveActivities.setupDefault(); OneSignal.Notifications.addEventListener( 'foregroundWillDisplay', @@ -229,18 +198,7 @@ const OSDemo: React.FC = () => { ); OneSignal.User.removeEventListener('change', onUserChange); }; - }, [ - onForegroundWillDisplay, - onNotificationClick, - onIAMClick, - onIAMWillDisplay, - onIAMDidDisplay, - onIAMWillDismiss, - onIAMDidDismiss, - onSubscriptionChange, - onPermissionChange, - onUserChange, - ]), + }, []), ); const inputChange = useCallback((text: string) => { From d9af3a7411cec61335e3be0f6cdcf3ea0d5156f2 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 16 Dec 2025 17:00:12 -0800 Subject: [PATCH 3/6] add 25sec timeout check --- .../rnonesignalandroid/RNOneSignal.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index 30115563..5ba935ba 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -393,15 +393,25 @@ public void onWillDisplay(INotificationWillDisplayEvent event) { try { synchronized (event) { - while (preventDefaultCache.containsKey(notificationId)) { - event.wait(); + // Wait while notification is still in cache (JS hasn't responded yet) + // Use timeout of 25 seconds to prevent infinite wait if JS doesn't respond + long timeout = 25000; // 25 seconds + long startTime = System.currentTimeMillis(); + while (notificationWillDisplayCache.containsKey(notificationId)) { + long elapsed = System.currentTimeMillis() - startTime; + long remaining = timeout - elapsed; + if (remaining <= 0) { + // Timeout: remove from cache and display by default + notificationWillDisplayCache.remove(notificationId); + break; + } + event.wait(remaining); } } // If notification wasn't prevented, display it automatically if (!preventDefaultCache.containsKey(notificationId)) { event.getNotification().display(); - notificationWillDisplayCache.remove(notificationId); } } catch (InterruptedException e) { Logging.error("InterruptedException: " + e.toString(), null); @@ -423,11 +433,11 @@ private void displayNotification(String notificationId) { // Notify waiting thread and clean up caches synchronized (event) { preventDefaultCache.remove(notificationId); + notificationWillDisplayCache.remove(notificationId); event.notify(); } event.getNotification().display(); - notificationWillDisplayCache.remove(notificationId); } @ReactMethod @@ -443,10 +453,9 @@ private void preventDefault(String notificationId) { // Add to cache and notify waiting thread synchronized (event) { this.preventDefaultCache.put(notificationId, event); + notificationWillDisplayCache.remove(notificationId); event.notify(); } - - notificationWillDisplayCache.remove(notificationId); } @ReactMethod From 674a6ddc86484fc1f372358f9428950b7f2bf6b9 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Wed, 17 Dec 2025 11:53:02 -0800 Subject: [PATCH 4/6] update os demo --- examples/RNOneSignalTS/OSDemo.tsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/examples/RNOneSignalTS/OSDemo.tsx b/examples/RNOneSignalTS/OSDemo.tsx index a2bbdf3f..629e1ba8 100644 --- a/examples/RNOneSignalTS/OSDemo.tsx +++ b/examples/RNOneSignalTS/OSDemo.tsx @@ -41,12 +41,16 @@ const OSDemo: React.FC = () => { const onForegroundWillDisplay = useCallback( (event: NotificationWillDisplayEvent) => { - console.log('OneSignal: notification will show in foreground:', event); + OSLog('OneSignal: notification will show in foreground:', event); - // console.log('Preventing display'); - // event.preventDefault(); + OSLog('Preventing display??????'); + event.preventDefault(); + + // display the notification + OSLog('Displaying notification'); + event.getNotification().display(); }, - [], + [OSLog], ); const onNotificationClick = useCallback( @@ -114,7 +118,7 @@ const OSDemo: React.FC = () => { useEffect(() => { OneSignal.initialize(APP_ID); - OneSignal.Debug.setLogLevel(LogLevel.None); + OneSignal.Debug.setLogLevel(LogLevel.Debug); }, []); useFocusEffect( @@ -127,6 +131,8 @@ const OSDemo: React.FC = () => { console.log('OneSignal ID:', onesignalID); const externalID = await OneSignal.User.getExternalId(); console.log('External ID:', externalID); + const pushID = await OneSignal.User.pushSubscription.getIdAsync(); + console.log('Push ID:', pushID); OneSignal.LiveActivities.setupDefault(); OneSignal.Notifications.addEventListener( From 247dc13e8822f3197d9a05425fbe5800a0fa7974 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Wed, 17 Dec 2025 12:06:02 -0800 Subject: [PATCH 5/6] fix display logic after calling prevent default --- .../onesignal/rnonesignalandroid/RNOneSignal.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index 5ba935ba..80e6a1b8 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -424,6 +424,18 @@ public void onWillDisplay(INotificationWillDisplayEvent event) { @ReactMethod private void displayNotification(String notificationId) { INotificationWillDisplayEvent event = notificationWillDisplayCache.get(notificationId); + + // If not found in notificationWillDisplayCache, check preventDefaultCache + // This handles the case where preventDefault() was called first + if (event == null) { + event = preventDefaultCache.get(notificationId); + if (event != null) { + Logging.debug( + "displayNotification called after preventDefault for notification with id: " + notificationId + + ". Displaying notification anyway.", null); + } + } + if (event == null) { Logging.error( "Could not find onWillDisplayNotification event for notification with id: " + notificationId, null); From 0144b2953f6894705bc61d02170905f32715fca2 Mon Sep 17 00:00:00 2001 From: Fadi George Date: Wed, 17 Dec 2025 12:17:31 -0800 Subject: [PATCH 6/6] add timing logic for display notifciation --- examples/RNOneSignalTS/OSDemo.tsx | 172 +++++++++----------- examples/RNOneSignalTS/package.json | 2 + ios/RCTOneSignal/RCTOneSignalEventEmitter.m | 58 ++++++- 3 files changed, 134 insertions(+), 98 deletions(-) diff --git a/examples/RNOneSignalTS/OSDemo.tsx b/examples/RNOneSignalTS/OSDemo.tsx index 629e1ba8..90076107 100644 --- a/examples/RNOneSignalTS/OSDemo.tsx +++ b/examples/RNOneSignalTS/OSDemo.tsx @@ -39,91 +39,73 @@ const OSDemo: React.FC = () => { }); }, []); - const onForegroundWillDisplay = useCallback( - (event: NotificationWillDisplayEvent) => { - OSLog('OneSignal: notification will show in foreground:', event); + useEffect(() => { + console.log('Initializing OneSignal'); + OneSignal.initialize(APP_ID); + OneSignal.Debug.setLogLevel(LogLevel.Debug); + }, []); - OSLog('Preventing display??????'); - event.preventDefault(); + useFocusEffect( + useCallback(() => { + console.log('Setting up event listeners'); - // display the notification - OSLog('Displaying notification'); - event.getNotification().display(); - }, - [OSLog], - ); + const onForegroundWillDisplay = (event: NotificationWillDisplayEvent) => { + OSLog( + 'OneSignal: notification will show in foreground:', + event.getNotification().title, + ); - const onNotificationClick = useCallback( - (event: unknown) => { - OSLog('OneSignal: notification clicked:', event); - }, - [OSLog], - ); + OSLog('Should show after 25 seconds:'); + let i = 1; + const interval = setInterval(() => { + OSLog('Seconds passed:', i); + i++; + if (i > 25) { + clearInterval(interval); + } + }, 1000); + // OSLog('Preventing display'); + // event.preventDefault(); - const onIAMClick = useCallback( - (event: unknown) => { - OSLog('OneSignal IAM clicked:', event); - }, - [OSLog], - ); + // OSLog('Displaying notification'); + // event.getNotification().display(); + }; - const onIAMWillDisplay = useCallback( - (event: unknown) => { - OSLog('OneSignal: will display IAM: ', event); - }, - [OSLog], - ); + const onNotificationClick = (event: unknown) => { + OSLog('OneSignal: notification clicked:', event); + }; - const onIAMDidDisplay = useCallback( - (event: unknown) => { - OSLog('OneSignal: did display IAM: ', event); - }, - [OSLog], - ); + const onIAMClick = (event: unknown) => { + OSLog('OneSignal IAM clicked:', event); + }; - const onIAMWillDismiss = useCallback( - (event: unknown) => { - OSLog('OneSignal: will dismiss IAM: ', event); - }, - [OSLog], - ); + const onIAMWillDisplay = (event: unknown) => { + OSLog('OneSignal: will display IAM: ', event); + }; - const onIAMDidDismiss = useCallback( - (event: unknown) => { - OSLog('OneSignal: did dismiss IAM: ', event); - }, - [OSLog], - ); + const onIAMDidDisplay = (event: unknown) => { + OSLog('OneSignal: did display IAM: ', event); + }; - const onSubscriptionChange = useCallback( - (subscription: unknown) => { - OSLog('OneSignal: subscription changed:', subscription); - }, - [OSLog], - ); + const onIAMWillDismiss = (event: unknown) => { + OSLog('OneSignal: will dismiss IAM: ', event); + }; - const onPermissionChange = useCallback( - (granted: unknown) => { - OSLog('OneSignal: permission changed:', granted); - }, - [OSLog], - ); + const onIAMDidDismiss = (event: unknown) => { + OSLog('OneSignal: did dismiss IAM: ', event); + }; - const onUserChange = useCallback( - (event: unknown) => { - OSLog('OneSignal: user changed: ', event); - }, - [OSLog], - ); + const onSubscriptionChange = (subscription: unknown) => { + OSLog('OneSignal: subscription changed:', subscription); + }; - useEffect(() => { - OneSignal.initialize(APP_ID); - OneSignal.Debug.setLogLevel(LogLevel.Debug); - }, []); + const onPermissionChange = (granted: unknown) => { + OSLog('OneSignal: permission changed:', granted); + }; - useFocusEffect( - useCallback(() => { - console.log('Setting up event listeners'); + const onUserChange = (event: unknown) => { + OSLog('OneSignal: user changed: ', event); + }; const setup = async () => { // OneSignal.login('fadi-rna-11'); @@ -134,32 +116,32 @@ const OSDemo: React.FC = () => { const pushID = await OneSignal.User.pushSubscription.getIdAsync(); console.log('Push ID:', pushID); - OneSignal.LiveActivities.setupDefault(); OneSignal.Notifications.addEventListener( 'foregroundWillDisplay', onForegroundWillDisplay, ); - OneSignal.Notifications.addEventListener('click', onNotificationClick); - OneSignal.InAppMessages.addEventListener('click', onIAMClick); - OneSignal.InAppMessages.addEventListener( - 'willDisplay', - onIAMWillDisplay, - ); - OneSignal.InAppMessages.addEventListener('didDisplay', onIAMDidDisplay); - OneSignal.InAppMessages.addEventListener( - 'willDismiss', - onIAMWillDismiss, - ); - OneSignal.InAppMessages.addEventListener('didDismiss', onIAMDidDismiss); - OneSignal.User.pushSubscription.addEventListener( - 'change', - onSubscriptionChange, - ); - OneSignal.Notifications.addEventListener( - 'permissionChange', - onPermissionChange, - ); - OneSignal.User.addEventListener('change', onUserChange); + // OneSignal.LiveActivities.setupDefault(); + // OneSignal.Notifications.addEventListener('click', onNotificationClick); + // OneSignal.InAppMessages.addEventListener('click', onIAMClick); + // OneSignal.InAppMessages.addEventListener( + // 'willDisplay', + // onIAMWillDisplay, + // ); + // OneSignal.InAppMessages.addEventListener('didDisplay', onIAMDidDisplay); + // OneSignal.InAppMessages.addEventListener( + // 'willDismiss', + // onIAMWillDismiss, + // ); + // OneSignal.InAppMessages.addEventListener('didDismiss', onIAMDidDismiss); + // OneSignal.User.pushSubscription.addEventListener( + // 'change', + // onSubscriptionChange, + // ); + // OneSignal.Notifications.addEventListener( + // 'permissionChange', + // onPermissionChange, + // ); + // OneSignal.User.addEventListener('change', onUserChange); }; console.log('Setup'); @@ -204,7 +186,7 @@ const OSDemo: React.FC = () => { ); OneSignal.User.removeEventListener('change', onUserChange); }; - }, []), + }, [OSLog]), ); const inputChange = useCallback((text: string) => { diff --git a/examples/RNOneSignalTS/package.json b/examples/RNOneSignalTS/package.json index 244cef81..f1890622 100644 --- a/examples/RNOneSignalTS/package.json +++ b/examples/RNOneSignalTS/package.json @@ -9,6 +9,8 @@ "preios": "bun run setup && bun run update:pod", "android": "react-native run-android", "ios": "react-native run-ios", + "log:android": "react-native log-android", + "log:ios": "react-native log-ios", "start": "react-native start" }, "dependencies": { diff --git a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m index 93abb6fe..a2191d48 100644 --- a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m +++ b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m @@ -389,12 +389,45 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { if (!strongSelf) return; - strongSelf->_notificationWillDisplayCache[event.notification.notificationId] = - event; + NSString *notificationId = event.notification.notificationId; + strongSelf->_notificationWillDisplayCache[notificationId] = event; [event preventDefault]; [RCTOneSignalEventEmitter sendEventWithName:@"OneSignal-notificationWillDisplayInForeground" withBody:[event.notification jsonRepresentation]]; + + // Wait for JS to respond (preventDefault or displayNotification) + // Use timeout slightly less than OneSignal SDK's 25s timeout (similar to Android's 25s with 30s SDK timeout) + // If JS doesn't respond within the timeout, display automatically + const NSTimeInterval kNotificationDisplayTimeout = 24.0; // Slightly less than SDK's 25s timeout + + // Capture notificationId in a local variable for the block + __block NSString *blockNotificationId = [notificationId copy]; + + dispatch_after( + dispatch_time(DISPATCH_TIME_NOW, (int64_t)(kNotificationDisplayTimeout * NSEC_PER_SEC)), + dispatch_get_main_queue(), ^{ + __weak RCTOneSignalEventEmitter *weakSelf = strongSelf; + RCTOneSignalEventEmitter *strongSelf = weakSelf; + if (!strongSelf) + return; + + // Check if notification is still in cache (JS didn't call displayNotification) + OSNotificationWillDisplayEvent *cachedEvent = + strongSelf->_notificationWillDisplayCache[blockNotificationId]; + if (cachedEvent) { + // Check if it wasn't prevented + if (!strongSelf->_preventDefaultCache[blockNotificationId]) { + // Display automatically if not prevented + // This matches Android: after wait loop exits, if not prevented, display + dispatch_async(dispatch_get_main_queue(), ^{ + [cachedEvent.notification display]; + }); + [strongSelf->_notificationWillDisplayCache + removeObjectForKey:blockNotificationId]; + } + } + }); } RCT_EXPORT_METHOD(preventDefault : (NSString *)notificationId) { @@ -412,8 +445,11 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { notificationId]]; return; } - strongSelf->_preventDefaultCache[event.notification.notificationId] = event; [event preventDefault]; + + // Add to preventDefaultCache and remove from notificationWillDisplayCache + strongSelf->_preventDefaultCache[event.notification.notificationId] = event; + [strongSelf->_notificationWillDisplayCache removeObjectForKey:notificationId]; } RCT_EXPORT_METHOD(clearAllNotifications) { [OneSignal.Notifications clearAll]; } @@ -573,6 +609,21 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { RCT_EXPORT_METHOD(displayNotification : (NSString *)notificationId) { OSNotificationWillDisplayEvent *event = _notificationWillDisplayCache[notificationId]; + + // If not found in notificationWillDisplayCache, check preventDefaultCache + // This handles the case where preventDefault() was called first + if (!event) { + event = _preventDefaultCache[notificationId]; + if (event) { + [OneSignalLog + onesignalLog:ONE_S_LL_DEBUG + message:[NSString + stringWithFormat: + @"OneSignal (objc): displayNotification called after preventDefault for notification with id: %@. Displaying notification anyway.", + notificationId]]; + } + } + if (!event) { [OneSignalLog onesignalLog:ONE_S_LL_ERROR @@ -583,6 +634,7 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { notificationId]]; return; } + dispatch_async(dispatch_get_main_queue(), ^{ [event.notification display]; });