React-native-notifee: [Android] Open application on notification press

Created on 16 Apr 2020  路  13Comments  路  Source: notifee/react-native-notifee

Hi,

I can't figure out how to the open the app when it's in background / quit state and the user press a notification.

My notifcations partern is the folowing (on background / quite state):

  • App receives a silent notification;
  • App treats the silent notification (fectching data + some other stuffs);
  • App generate a local notification to be displayed;

Everything works fine exept that the local notification can not be press, or at least pressing it doesn't open the app, whatever its state is.

The notification object look like this:

let nofifData = {
        title: "title",
        body : "body",
        id: notifId.toString(),
        data : { conv_key: data.conv_key},
        android: {
            channelId : 'myAppChannel',
            autoCancel : true,
            color : "#72CDCF",
            importance : Importance.HIGH,
            smallIcon : "ic_notification",
            sound: localPref.sound ? "default" : '',
            badgeCount : getBadgeCount(),
            pressAction: {
                id: "default",
            },
        }
    };

By the way, when I press the notification, i get in the logs a warning:
No task registered for key app.notifee.notification.event
I'm not sure it's related but well, it doest hurt mentionning it...

Thanks in advance for any help (and for the library !)

Worth mentionning (or not) that I'm also using

  • Firebase Cloud Messaging
  • wix/react-native-navigation
  • RN 62.2
  • notifee : 0.4.0

Most helpful comment

It works!

Thanks @yotam-nots

But press local notification with app in background, dont triger any event in app :(
I need a method like messaging().onNotificationOpenedApp to receive notification when user press it

All 13 comments

same problem i am facing :(

Hey, I can partly answer that as I also had the same problem.

You need to call notifee.onBackgroundEvent(onBackgroundEventNotifee); to register your handler for these events. The problem I am now seeing however is when I do this it seems to conflict with the call I make to RN Firebase to set the background handler with messaging().setBackgroundMessageHandler(onBackgroundMessageReceived);

If I have both of those in my index.js it stops receiving notifications. I think what would help everybody here is a sample project which shows the expected setup with RN Firebase for example

can you please show a sample to use notifee.onBackgroundEvent(onBackgroundEventNotifee);

That's all there is to it really. Provide the function you want invoked as a param when the notification is opened and do whatever you want in it

If I were to take a guess, I'd say wix/react-native-navigation is the problem here. Let me take a look at their docs are see what they're doing with intents/activities.

+1

I've had luck with

pressAction: {
  launchActivity: "default",
  id: "default",
},

I've had luck with

pressAction: {
  launchActivity: "default",
  id: "default",
},

Thanks ! It did the trick :)
@Ehesp, it might adding this in the docs.

It works!

Thanks @yotam-nots

But press local notification with app in background, dont triger any event in app :(
I need a method like messaging().onNotificationOpenedApp to receive notification when user press it

Need to check this out, if the pressAction on the root of a notification didn't have a launchActivity it should be default behind the scenes - seems this is a bug

The docs clearly say that If the application is in a minimized state it is moved to the foreground with this code:

notifee.displayNotification({
  title: 'New notification',
  android: {
    channelId,
    pressAction: {
      id: 'default',
    },
  },
});

But so far I cannot see any way to do this with any type of action handling - I cannot seem to _only_ move the app from the background to the foreground which I think should be changed, because as the docs also say:

The Android guidelines suggest a notification should always open the application when pressed.

I have tried to launch the root app component as a 'custom component':

javascript: pressAction: { id: 'default', mainComponent: App, },
but this seems to have the same effect as assigning launchActivity: 'default' to an action which kills the app before launching it.

I have tried to launch the root app component as a 'custom component':

        pressAction: {
          id: 'default',
          mainComponent: App,
        },

but this seems to have the same effect as assigning launchActivity: 'default' to an action which kills the app before launching it.

mainComponent: App, is incorrect here, this should be the string name of the component registered via AppRegistry.registerComponent rather than the component itself: https://notifee.app/react-native/docs/android/interaction#advanced-custom-component

It would be nice if we had a single callback onNotificationOpen and getInitialNotification that works on both react-native-firebase and notifee or a notifee.onNotificationOpenedApp, because I have to handle 4 callbacks/logic and they do not work to all use cases for me. I just gave up using onBackgroundEvent and created a custom logic, because it does not allow me to differentiate app killed/quit (background) to app minimized (also background) and it is not called for notification generated by FCM on background.

I am using this logic below to be able to identify the push was opened, based on the fact that after getInitialNotification of notifee and react-native-firebase are called it does not return duplicated notification. Also I call the function checkAppOpenedByNotification on onNotificationOpen and onForegroundEvent:

```
useEffect(() => {
const onOpenNotification = (localNotification: LocalNotification) => {
Alert.alert(localNotification.action)
}

fcmService.checkAppOpenedByNotification(onOpenNotification)
const handleAppStateChange = (state: AppStateStatus) => {
  if (state === 'active') {
    fcmService.checkAppOpenedByNotification(onOpenNotification)
  }
}
AppState.addEventListener('change', handleAppStateChange)
return () => {
  AppState.removeEventListener('change', handleAppStateChange)
  fcmService.unRegisterForegroundListeners()
}

}, [])


// fcmService.ts
public checkAppOpenedByNotification = async (OnOpenedNotification: OnOpenedNotification) => {
const notification = await this.getInitialNotification()
if (notification) {
OnOpenedNotification(notification)
}
}

private getInitialNotification = async () => {
const notifeeNotification = await notifee.getInitialNotification()
const remoteNotification = await messaging().getInitialNotification()
return (notifeeNotification && mapNotifeeNotificationToLocalNotification(notifeeNotification))
|| (remoteNotification && mapRemoteNotificationToLocalNotification(remoteNotification))
}
```

Was this page helpful?
0 / 5 - 0 ratings