Search code examples
androidiosionic-frameworkfirebase-cloud-messagingcordova-plugin-fcm

Sending notifications via FCM when app is active


How can I leave a push message unread, even if the app is foreground?

I am creating an application using ionic. I use push notifications using firebase cloud messaging (cordova-plugin-fcm-with-dependecy-updated) to subscribe to messages, and backend for sending. Example backend request:

{
   "headers": {
      "Authorization": "key = blahblah",
      "Content-Type": "application / json",
      "project_id": "111111111111"
   },
   "json": {
      "registration_ids": [
         "token"
      ],
      "time_to_live": 1200,
      "data": {
         "title": "title",
         "body": "body",
         "sound": "default",
         "badge": 1,
         "click_action": "FCM_PLUGIN_ACTIVITY"
      }
   }
}

I also tried to send the notification key instead of the date key. Tried to add to root

{
    ...
    "android": {
        "ttl": "1200s",
        "priority": "high",
        "notification": {
            "click_action": "FCM_PLUGIN_ACTIVITY"
        }
    },
    ...
    "apns":{
        "headers":{
            "apns-priority":10,
            "apns-expiration": date('U') + 1200
        },
        "payload":{
            "aps":{
                "badge":1,
                "category":"FCM_PLUGIN_ACTIVITY"
            }
        }
    }
}

The result is the same - when the application is in the background, the push is not displayed in the tray.

How can I leave push unread, if app in foreground, and call my actions at this.fcm.onNotification().subscribe(...) only on user's click?

p.s. I tried to use cordova-plugin-local-notification, but using this caused some conflict - subscribe action doesn't fire in ios


Solution

  • I use ionic and cordova in my app.

    I am using the plugin [cordova-plugin-firebasex] (https://github.com/dpa99c/cordova-plugin-firebasex) to receive push.

    To send the push, use the following json:

    {
      "registration_ids": [
          "token"
      ],
      "notification":{
        "title":"Ionic 4 Notification",
        "body":"Notification sent from POSTMAN",
        "sound":"default",
        "click_action":"FCM_PLUGIN_ACTIVITY",
        "icon":"notification_icon"
      },
      "data":{
        "email":"teste@gmail.com"
      },
      "priority":"high"
    }
    

    For android, the "notification" field that displays a notification when the application is in the background.

    If you are in foreground, you have to display a notification yourself using the plugin [cordova-plugin-local-notifications] (https://github.com/katzer/cordova-plugin-local-notifications)

    My code:

    constructor(private firebaseCordova: FirebaseX) {}
    
    private initializePushApp() {
        this.checkNotificationPermission(false);
        this.onMessageApp();
    }
    
    checkNotificationPermission(requested) {
        try {
            this.firebaseCordova.hasPermission().then(hasPermission => {
                if (hasPermission) {
                    this.getTokenApp();
                } else if (!requested) {
                    this.firebaseCordova.grantPermission().then(value => {
                        this.checkNotificationPermission(true);
                    });
                } else {
                    // Denied
                    console.log("Notifications won't be shown as permission is denied");
                }
            });
        } catch (e) {
            console.error(e);
        }
    }
    
    onMessageApp() {
        try {
            this.firebaseCordova.onMessageReceived().subscribe(data => {
                this.showNotificationCordova(data);
            });
        } catch (e) {
            console.error(e);
        }
    }
    
    showNotificationCordova(notification) {
        if ('background' === notification.tap) {
            // click on notification in background
            alert(notification.title);
        } else {
            this.clickNotificationSub = this.localNotifications.on('click').subscribe(data => {
                // click on notification in foreground
                alert(notification.title);
            });
    
            this.localNotifications.hasPermission().then(permission => {
                if (permission) {
                    this.localNotifications.schedule({
                        id: 1,
                        title: notification.title,
                        text: notification.body,
                        icon: notification.image ? notification.image : 'notification_icon',
                    });
                } else {
                    this.localNotifications.requestPermission().then(value => {
                        if (value) {
                            this.localNotifications.schedule({
                                id: 1,
                                title: notification.title,
                                text: notification.body,
                               icon: notification.image ? notification.image : 'notification_icon',
                            });
                        } else {
                            console.log("Notifications won't be shown as permission is denied");
                        }
                    });
                }
            });
        }
    }
    

    When you enter this condition 'background' === notification.tap` the notification was clicked in the background