Search code examples
javascriptandroidpush-notificationnativescripttelerik-appbuilder

Handle Push notification in Nativescript


I am working on application in Nativescript which implements push notification. Lets say server sends push notification and based on action mentioned in payload of notification i will have to redirect in application. This redirection should be performed if user taps on notification from drawer and application is in background. Other case when application should not redirect if its in foreground. I have managed a flag for that as follow

app.js

application.on(application.launchEvent, function (args) {
   appSettings.setBoolean('AppForground', true);
});

application.on(application.suspendEvent, function (args) {
   appSettings.setBoolean('AppForground', false);
});

application.on(application.resumeEvent, function (args) {
   appSettings.setBoolean('AppForground', true);
});

application.on(application.exitEvent, function (args) {
   appSettings.setBoolean('AppForground', false);
});

application.on(application.lowMemoryEvent, function (args) {
   appSettings.setBoolean('AppForground', false);
});

application.on(application.uncaughtErrorEvent, function (args) {
   appSettings.setBoolean('AppForground', false);
});

And on Push notification listener

 var settings = {
    // Android settings
    senderID: '1234567890', // Android: Required setting with the sender/project number
    notificationCallbackAndroid: function(data, pushNotificationObject) { // Android: Callback to invoke when a new push is received.
        var payload = JSON.parse(JSON.parse(pushNotificationObject).data);
        if (appSettings.getBoolean('AppForground') == false){
            switch (payload.action) {

                case "APPOINTMENT_DETAIL":
                    frame.topmost().navigate({
                        moduleName: views.appointmentDetails,
                        context: {
                            id: payload.id
                        }
                    });  
                    break;

                case "MESSAGE":
                    frame.topmost().navigate({
                        moduleName: views.appointmentDetails,
                        context: {
                            id: payload.id,
                            from: "messages"
                        }
                    });
                    break;

                case "REFERENCES":
                    frame.topmost().navigate({
                        moduleName: views.clientDetails,
                        context: {
                            id: payload.id,
                            name: ""
                        }
                    });
                    break;

                default: 
            }
        }
    },

    // iOS settings
    badge: true, // Enable setting badge through Push Notification
    sound: true, // Enable playing a sound
    alert: true, // Enable creating a alert

    // Callback to invoke, when a push is received on iOS
    notificationCallbackIOS: function(message) {
        alert(JSON.stringify(message));
    }
};
pushPlugin.register(settings,
    // Success callback
    function(token) {
        // if we're on android device we have the onMessageReceived function to subscribe
        // for push notifications
        if(pushPlugin.onMessageReceived) {
            pushPlugin.onMessageReceived(settings.notificationCallbackAndroid);
        }
    },
    // Error Callback
    function(error) {
        alert(error);
    }
);

Now the problem, is that if application is in killed state and notification arrives. Then it sets flag to true as application is launched which it should not. So due to that redirection is not performed and in other cases when application is in foreground state then also its navigating through pages (which should not be) on receiving notification.

I doubt about flag management is causing the problem but not sure. Would you please guide me if anything is wrong with what i did ?

UPDATE

I am using push-plugin.

Thanks.


Solution

  • I use this for notifications

    https://github.com/EddyVerbruggen/nativescript-plugin-firebase

    This plugin use FCM, it adds to datas received from notifications foreground parameter so from payload you can determine if app was background(foreground==false, app is not active or was started after notification arrived) or foreground(foreground==true, app is open and active), but you need to some changes to code as they are different plugins