SDK Notification Event Handlers

Handling Notification Events within OneSignal

The Notification Events on this page require the Major Release Versions of the OneSignal SDK.

Notification EventsDetails
Foreground Notification Received EventOneSignal SDK setNotificationWillShowInForegroundHandler method runs before displaying a notification while the app is in focus. Use this handler to decide if the notification should show or not.
Notification Opened EventOneSignal SDK setNotificationOpenedHandler method runs upon opening the app after a notification is clicked.
Background Notification Received EventNative Methods that run while a notification is received while app is in the background. These methods require using Native Code like Java/Kotlin or Swift/Objective-C.
Force-quit Notification Received EventiOS - Force-quit state is when the app has been "swiped away" and not running in the foreground or background. Apple still keeps an open connection to your app but requires the Service Extensions for notification data detection.

Android - Force-quit generally happens manually through the App Settings and prevents any communication to your app. Further, some OEMs will put your app into this force-quit state when swiping the app away. See Notifications Not Shown for more details.

Foreground Notification Received Event

setNotificationWillShowInForegroundHandler Method

Runs before displaying a notification while the app is in focus. Use this handler to read notification data and change it or decide if the notification should show or not.

Call setNotificationWillShowInForegroundHandler before you set OneSignal.setNotificationOpenedHandler.

Note: this runs after the Notification Service Extension which can be used to modify the notification before showing it.

PlatformParameterType
AndroidOSNotificationWillShowInForegroundHandlerCallback
iOSOSNotificationWillShowInForegroundBlockBlock
OneSignal.setNotificationWillShowInForegroundHandler(new NotificationWillShowInForegroundHandler() {
   @Override
   void notificationWillShowInForeground(OSNotificationReceivedEvent notificationReceivedEvent) {
     OSNotification notification = notificationReceivedEvent.getNotification();
     // Get custom additional data you sent with the notification
     JSONObject data = notification.getAdditionalData();

     if (/* some condition */ ) {
        // Complete with a notification means it will show
        notificationReceivedEvent.complete(notification);
     }
     else {
       // Complete with null means don't show a notification
       notificationReceivedEvent.complete(null);
    }
  }
});
let notificationWillShowInForegroundBlock: OSNotificationWillShowInForegroundBlock = { notification, completion in
  print("Received Notification: ", notification.notificationId ?? "no id")
  print("launchURL: ", notification.launchURL ?? "no launch url")
  print("content_available = \(notification.contentAvailable)")

  if notification.notificationId == "example_silent_notif" {
    // Complete with null means don't show a notification  
    completion(nil)
  } else {
    // Complete with a notification means it will show
    completion(notification)
  }
}
OneSignal.setNotificationWillShowInForegroundHandler(notificationWillShowInForegroundBlock)
id notificationWillShowInForegroundBlock = ^(OSNotification *notification, OSNotificationDisplayResponse completion) {
        NSLog(@"Received Notification - %@", notification.notificationId);
        if ([notification.notificationId isEqualToString:@"silent_notif"]) {
            completion(nil);
        } else {
            completion(notification);
        }
    };

[OneSignal setNotificationWillShowInForegroundHandler:notificationWillShowInForegroundBlock];
OneSignal.setNotificationWillShowInForegroundHandler(notificationReceivedEvent => {
  console.log("OneSignal: notification will show in foreground:", notificationReceivedEvent);
  let notification = notificationReceivedEvent.getNotification();
  console.log("notification: ", notification);
  const data = notification.additionalData
  console.log("additionalData: ", data);
  //Silence notification by calling complete() with no argument
  notificationReceivedEvent.complete(notification);
});
OneSignal.shared.setNotificationWillShowInForegroundHandler((OSNotificationReceivedEvent event) {
  // Display Notification, send null to not display, send notification to display           
  event.complete(event.notification);      
});
window.plugins.OneSignal.setNotificationWillShowInForegroundHandler(function(notificationReceivedEvent) {
  notificationReceivedEvent.complete(notificationReceivedEvent.getNotification());
});
OneSignal.Default.NotificationWillShow += onNotificationWillShow;

Notification onNotificationWillShow(Notification notification) {
    if (someCheck)
        return null; // don't show the notificaiton

    // COMING SOON - make modifications to the notification before showing
    
    return notification; // show the notification
}

OSNotificationReceivedEvent methods:

TypeFieldDescription
void (Android)
OSNotificationDisplayResponse (iOS)
complete()
completion() (iOS Native)
Required:
Method controlling notification completion from the handler. If this is not called at the end of the notificationWillShowInForeground implementation, a runnable will fire after a 25 second timer and complete automatically.

Parameter:
- Display: pass the OSNotification object
- Omit: pass null to omit displaying
OSNotificationgetNotification()
notification (iOS Native)
Method
The notification the device received.

See OSNotification for more details.

Notification Opened Event

setNotificationOpenedHandler Method

This method takes a OSNotificationOpenedHandler callback that itself accepts a parameter result of type OSNotificationOpenedResult.

PlatformParameterType
AndroidOSNotificationOpenedHandlerCallback
iOSOSNotificationOpenedBlockBlock
OneSignal.setNotificationOpenedHandler(
   new OneSignal.OSNotificationOpenedHandler() {
     @Override
     public void notificationOpened(OSNotificationOpenedResult result) {
       String actionId = result.getAction().getActionId();
       String type = result.getAction().getType(); // "ActionTaken" | "Opened"
  
       String title = result.getNotification().getTitle();
     }
});
let notificationOpenedBlock: OSNotificationOpenedBlock = { result in
    // This block gets called when the user reacts to a notification received
    let notification: OSNotification = result.notification
    print("Message: ", notification.body ?? "empty body")
    print("badge number: ", notification.badge)
    print("notification sound: ", notification.sound ?? "No sound")
            
    if let additionalData = notification.additionalData {
        print("additionalData: ", additionalData)
        if let actionSelected = notification.actionButtons {
            print("actionSelected: ", actionSelected)
        }
        if let actionID = result.action.actionId {
            //handle the action
        }
    }
}

OneSignal.setNotificationOpenedHandler(notificationOpenedBlock)
id notificationOpenedBlock = ^(OSNotificationOpenedResult *result) {
  OSNotification* notification = result.notification;
  if (notification.additionalData) {
    if (result.action.actionId) {
      fullMessage = [fullMessage stringByAppendingString:[NSString stringWithFormat:@"\nPressed ButtonId:%@", result.action.actionId]];
    }
  }
  
[OneSignal setNotificationOpenedHandler:notificationOpenedBlock];
OneSignal.setNotificationOpenedHandler(openedEvent => {
  console.log("OneSignal: notification opened:", openedEvent);
  const { action, notification } = openedEvent;
});
OneSignal.shared.setNotificationOpenedHandler((OSNotificationOpenedResult result) {
    print('"OneSignal: notification opened: ${result}');
});
var notificationOpenedCallback = function(jsonData) {
  var notificationData = JSON.stringify(jsonData)
  console.log('notificationOpenedCallback: ' + notificationData);
};

window.plugins.OneSignal.setNotificationOpenedHandler(notificationOpenedCallback);
OneSignal.Default.NotificationOpened += onNotificationOpened;

void onNotificationOpened(NotificationOpenedResult result) {
    var notif = result.notification;
    var action = result.action;
}

OSNotificationOpenResult fields:

TypeMethod/PropertyDescription
OSNotificationgetNotification() (Android)
notification (iOS)
The notification the user received.
See OSNotification for the full list of properties.
OSNotificationActiongetAction() (Android)
action (iOS)
The action the user took on the notification.

String - getActionId()
Enum - getType() ("Opened", "ActionTaken")

OSNotification Class

The OSNotification class is composed of all getters. The class combines the original OSNotification with data previously on the OSNotificationPayload class into a single large OSNotification class.

More details in OSNotification Payload.

OSNotificationAction Class

The action the user took on the notification.

More details in OSNotification Payload.


Background Notification Received Event

Android Background Notification Received Event

Requires native code. See Android Notification Service Extension for more details.

iOS Background Notification Received Event

application(_:didReceiveRemoteNotification:fetchCompletionHandler:) method

Apple provides this method to indicate a notification was received when your app is running in the foreground or background. This method allows data to be fetched while the app is running in the background. See details and discussion for requirements in Apple's Developer Documentation.

If your app is force-quite, this method will not run and requires the Service Extensions for detection.

You must have background mode enabled and send the push with content_available in the iOS Message Settings for method to be called while app is in background.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("iOS Native didReceiveRemoteNotification: ", userInfo.debugDescription)
    
    if let customOSPayload = userInfo["custom"] as? NSDictionary {
        if let additionalData = customOSPayload["a"] as? NSDictionary {
            print("additionalData: ", additionalData)
            if let foo = additionalData["foo"] {
                print("foo: ", foo)
            }
        }
        if let notificationId = customOSPayload["i"] {
            print("notificationId: ", notificationId)
        }
        if let launchUrl = customOSPayload["u"] {
            print("launchUrl: ", launchUrl)
        }
    }
    if let aps = userInfo["aps"] as? NSDictionary {
        if let alert = aps["alert"] as? NSDictionary {
            if let messageBody = alert["body"] {
                print("messageBody: ", messageBody)
            }
            if let messageTitle = alert["title"] {
                print("messageTitle: ", messageTitle)
            }
        }
    }
    // This block gets called when the user reacts to a notification received
    let timeInterval = Int(NSDate().timeIntervalSince1970)
    OneSignal.sendTags(["last_push_received": timeInterval])
    
    print("badge number: ", UIApplication.shared.applicationIconBadgeNumber.description)
}