Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run a function when a notification is received with Firebase Messaging ^8.0.0-dev.8 in Flutter?

Hello I'm using Flutter to build my app and I need to to show an alert whenever a new notification is received.
I've been using firebase_messaging 7.0.3 but I run into an error with onBackgroundMessage. A quick Google search helped me find out that the error I was getting hasn't been fixed yet. However one of the devs posted an update 20 days ago about a new version of the package which fixed that issue.
The new version removed the old onMessage handlers and introduced new ones. Now they got new event handlers which return streams, but haven't been able to make them fire by using the .listen() function. Whenever I receive a notification a get a this: D/FLTFireMsgReceiver(22032): broadcast received for message printed in the console but the code in the .listen() doesn't get executed.

Here is a link to an article on Firebase Flutter that is a guide for using the new version of the package. Here is my code:

...
FirebaseMessaging.onMessage.listen((event) {
 // do something
});
FirebaseMessaging.onMessageOpenedApp.listen((event) {
 // do something
});
FirebaseMessaging.onBackgroundMessage((message) {
 // do something
 return;
 }
...
like image 640
Andrej Avatar asked Nov 21 '20 20:11

Andrej


2 Answers

A solution I found to get the events to fire was to always call:

await FirebaseMessaging.instance.getToken();

right after the

await Firebase.initializeApp();

Once I call that, the FirebaseMessaging.onMessage.listen catches the event as expected.

like image 51
Michael Woolsey Avatar answered Sep 19 '22 07:09

Michael Woolsey


  • I was getting the same log when my app is in doze mode for the Data notification with high priority. This is because of some issue in the firebase-messaging plugin.
  • Firebase_messaging plugin internally uses JobIntentService to process background fcm notifications
  • JobIntentService has one constraint in Android O or later versions, when running a Job it will be subject to standard JobScheduler policies. The job will not run immediately while the device is in doze mode. (reference link)
  • The same issue was raised in the firebase_messaging git repository(bug link)

Solution

  • One Signal(another push notification provider) solved this issue by having a modified version of JobIntentService. (OneSignal Solution)
  • At a high level, it uses wake locks for high priority fcm notifications to run service even in Android O and above.
  • Add this Pull Request changes in your ide by editing respective files.

TL;DR

Add this Pull Request changes in your ide by editing respective files. Send Data notification with High priority.

FCM Payload:

{
"message": {
    "token": "fcm_client_token",
    "data": {
        "title": "Hello",
        "body": "Test Message"
    },
    "android": {
        "priority": "high"
    }
}

}

like image 31
raghu Avatar answered Sep 21 '22 07:09

raghu