quickstart-js icon indicating copy to clipboard operation
quickstart-js copied to clipboard

onMessage() not fired when app is in background (Web javascript).

Open quyle92 opened this issue 3 years ago • 4 comments

I building a simple demo chat app with fcm integrated for new message notification. As far as I know, in fcm doc regarding onMessage(), it said this method get called when: (1) a message is received while the app has focus (2) - the user clicks on an app notification created by a service worker messaging.onBackgroundMessage handler.

But I'm not sure why onMessage() callback is not fired when my app is in background.

Step 1: Describe your environment

  • Operating system: OSX Big Sur
  • Browser: All
  • Firebase SDK version: 8.9.1

Step 2: Describe the problem:

onMessage() callback is not fired when my app is in background.

Steps to reproduce:

  1. hide current browser window to make it in background state.
  2. send test message.

Observed Results:

onBackgroundMessage() from sw.js get called fine, but when I clicked on the notification to land on my app window, onMessage() did not get triggered (it's only triggered when the current browser window is in foreground state). It did not show any error or warning.

Expected Results:

onMessage() should be fired after I clicked the notification to have my app focused.

Relevant Code:

this is my index file

const messaging = firebase.messaging();

    function sendTokenToServer(fcm_token) {
        let player_sn = '{{Auth::id()}}';
        axios.post('api/save-token', {
                fcm_token,
                player_sn
            })
            .then(function(response) {
                // console.log(response);
            })
            .catch(function(error) {
                console.log(error);
            });
    }

    messaging.getToken({
        vapidKey: '{{config("fcm.VAPID")}}'
    }).then((currentToken) => {
        // console.log(currentToken)
        if (currentToken) {
            sendTokenToServer(currentToken)
        } else {
            // Show permission request UI
            console.log('No registration token available. Request permission to generate one.');
            // ...
        }
    }).catch((err) => {
        console.log('An error occurred while retrieving token. ', err);
        // ...
    });

    messaging.onMessage((payload) => {
        console.log('onMessage');
        console.log(payload)
    });

this is my sw.js

importScripts('https://cdnjs.cloudflare.com/ajax/libs/firebase/8.10.1/firebase.js');
importScripts('https://cdnjs.cloudflare.com/ajax/libs/firebase/8.10.1/firebase-messaging.min.js');

const firebaseConfig = {

    apiKey: "AIzaSyBE90OnfKk6MELQ2-Z_DVLYp4maXVzvQO8",

    authDomain: "ninja-firestore-tut-nov11.firebaseapp.com",

    databaseURL: "https://ninja-firestore-tut-nov11-default-rtdb.asia-southeast1.firebasedatabase.app",

    projectId: "ninja-firestore-tut-nov11",

    storageBucket: "ninja-firestore-tut-nov11.appspot.com",

    messagingSenderId: "28680409583",

    appId: "1:28680409583:web:66bef6c94232b88816e61a"

};
firebase.initializeApp(firebaseConfig);
const messaging = firebase.messaging();
messaging.onBackgroundMessage((payload) => {
    console.log('onBackgroundMessage ', payload);
    // Customize notification here
     const {title, body} = payload.notification;
     const notificationTitle = title;
     const notificationOptions = {
         body: body,
         icon: '/firebase-logo.png'
     };
    // self.registration.showNotification(notificationTitle,
    //     notificationOptions);



});

Note: I need to comment self.registration.showNotification(notificationTitle, notificationOptions); to avoid the notification got duplicate.

Any help on this would be much appreciated... Thank you.

quyle92 avatar Feb 06 '22 04:02 quyle92

Same problem. I'm getting "this site has been updated in the background"

I'm using Reac.js "react": "^17.0.2", "firebase": "9.6.7",

Any one can help?

Vijayakumarktm avatar Feb 24 '22 07:02 Vijayakumarktm

Facing the same problem.

safiull avatar Jul 25 '22 18:07 safiull

I believe the firebase web documentation is not very clear. In my case the onMessage and onBackgroundMessage were explicitly fired. It was either one or the other.

What I did was, I setup a communication channel between the app and the service worker using the Client API. Good article here.

altinselimi avatar Jan 27 '23 10:01 altinselimi

I suspect the issue might be stemming from the Firebase Cloud Messaging (FCM) SDK, which automatically displays notifications when your app is in the background. If, in addition to this, you are manually triggering a notification inside the onBackgroundMessage handler, it would result in duplicate notifications being displayed I can solve this deleting the notification and only send the data

In the documentation can see this Docs

spartan73rmy avatar Jun 13 '23 20:06 spartan73rmy