17

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;
 }
...
Andrej
  • 2,743
  • 2
  • 11
  • 28
  • 1
    I am facing the same issue too, were u able to solve this?? – lordvcs Jan 19 '21 at 05:11
  • I ended up using `firebase_messaging: ^7.0.3`. I fixed the error I was getting by adding `Future myBackgroundMessageHandler(Map message) async {}` to the top of the file (under the imports), and setting `onBackgroundMessage: myBackgroundMessageHandler`. It now works perfectly and I haven't come accross any error yet. – Andrej Jan 19 '21 at 12:56

2 Answers2

27

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.

Michael Woolsey
  • 803
  • 8
  • 15
1
  • 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"
    }
}

}

raghu
  • 671
  • 5
  • 16