Describe the bug
The onMessage callback is always called twice
To Reproduce
Steps to reproduce the behavior:
print statement in the onMessage callbackExpected behavior
Only one print on the console
Additional context
I don' t have the same issue with onBackgroundMessage. It's called once as expected
Facing same issue. onResume and onLaunch works fine but onMessage triggers twice.
Facing same issue.!
Facing the same problem with onMessage and onResume.
Same issue here, its is boring, in other app with other version the bug dont occurs T_T
I confirm (firebase messaging 6.0.9, and flutter 1.12.13+hotfix.5)
but it happens only on Android, not iOS.
Only on the android, it seems to me. Its easy to handle programmatically but not sure if there's a clean way to deal with it.
Facing same issue.
I confirm it's only on Android
onResume is also called twice
Here the same issue, I get duplicate notifications on android (onResume and OnMessage). Here you will find all my details. It is the default flutter project with firebase firebase_messaging: ^6.0.9
Output:
W/FirebaseMessaging( 7129): Unable to log event: analytics library is missing
W/FirebaseMessaging( 7129): Unable to log event: analytics library is missing
I/flutter ( 7129): onMessage: {notification: {title: prueba, body: prueba}, data: {click_action: FLUTTER_NOTIFICATION_CLICK}}
I/flutter ( 7129): onMessage: {notification: {title: prueba, body: prueba}, data: {click_action: FLUTTER_NOTIFICATION_CLICK}}
same issue on iOS. onMessage called twice with different message ID, so there could be the issue on server side.
I double checked that my php call run only once, but somehow I received 2 message. In both cases: foreground and background too....
Same here, on Message is called twice, flutter team are you listening?
@janosdupai I don't have this issue on iOS. I tested again today
@woprandi
I use Firebase Cloud Message for a Flutter app.
I try to trigger a push notification with php code. It give me a success: 1 result, but on my device I always receive 2 message with the same title&body but different message ID (which is provided by google firebase).
I double checked, that I trigger this function only once on a server side.
my code on the server
$url = 'https://fcm.googleapis.com/fcm/send';
$msg = array
(
'body' => $message,
'title' => $title,
'badge' => 1,/*Default sound*/
'sound' => 'default',
);
$fields = array
(
'registration_ids' => $id,
'notification' => $msg
);
$fields = json_encode ( $fields );
$apiKey = 'XXXXXXX'; //IOS
$headers = array (
'Authorization: key='.$apiKey,
'Content-Type: application/json'
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_POST, true );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );
$result = curl_exec ( $ch );
curl_close ( $ch );
echo $result;
I tried to trigger this from Terminal, which worked fine, and sent only 1 message. My terminal code:
DATA='{"notification": {"body": "this is a body","title": "this is a title"}, "priority": "high", "data": {"click_action": "FLUTTER_NOTIFICATION_CLICK", "id": "1", "status": "done"}, "to": "MYDEVICETOKEN"}'
curl https://fcm.googleapis.com/fcm/send -H "Content-Type:application/json" -X POST -d "$DATA" -H "Authorization: key=XXXXXXXXX"
@janosdupai Can you check the FCM response via curl -i ?
@woprandi
{"multicast_id":8502274311835153380,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"1579683773320267"}]}
I receive this message_id in flutter app, but I receive another one in a small delay (with same message title and body)....
on flutter console
flutter: {status: done, id: 1, click_action: FLUTTER_NOTIFICATION_CLICK, google.c.a.e: 1, gcm.message_id: 1579683773320267, aps: {alert: {title: This is title #1, body: here is a message. message}, sound: default}}
flutter: {status: done, id: 1, click_action: FLUTTER_NOTIFICATION_CLICK, google.c.a.e: 1, gcm.message_id: 1579685542411682, aps: {alert: {title: This is title #1, body: here is a message. message}, sound: default}}
I'm test used terminal but the result it's same. onMessage is called twice. I'm testing on Android device.
@woprandi
{"multicast_id":8502274311835153380,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"1579683773320267"}]}
I receive this message_id in flutter app, but I receive another one in a small delay (with same message title and body)....
on flutter console
flutter: {status: done, id: 1, click_action: FLUTTER_NOTIFICATION_CLICK, google.c.a.e: 1, gcm.message_id: 1579683773320267, aps: {alert: {title: This is title #1, body: here is a message. message}, sound: default}}
flutter: {status: done, id: 1, click_action: FLUTTER_NOTIFICATION_CLICK, google.c.a.e: 1, gcm.message_id: 1579685542411682, aps: {alert: {title: This is title #1, body: here is a message. message}, sound: default}}
I receive it two times even from terminal
Facing same issue with firebase_messaging: ^6.0.9. onMessage and onResume called multiple times
Same here, on Message is called twice, flutter team are you listening?
Can you imagine how many issues there are under this package? You need to be more appreciative of their craft bro. They can't solve everything overnight, give them some time.
After fast investigation, the method onAttachedToEngine of the class FirebaseMessagingPlugin, which call registerReceiver, is called twice. That explain the double call.
I will try to continue to investigate but I'm not an expert
A working workaround :
class MainActivity: FlutterActivity() {
/* override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}*/
}
Thanks @woprandi for filing the issue and diagnosing this! Just as a warning, that workaround should fix this specific bug for firebase_messaging but may cause issues in other plugins like google_maps_flutter because of a bug with the current registration flow. We're tracking the larger issue at flutter/flutter#49365.
@mklim Thanks for the info, I wasn't able to find the goal of the MainActivity content.
@mklim is there any updates?
@hp1227 yes. The fixes for the underlying issue have rolled into Flutter as of flutter/flutter@4fbb85e0c207132e0ed9130d7410784c00f0d066, but aren't on any of the channels besides master. I'm hoping to be able to hotfix this into stable, but don't have news to report on that front yet.
The root cause of this is flutter/flutter#49365. I think this issue is still worth keeping open in case firebase_messaging can work around the underlying Flutter problem individually, but that's probably the right bug to track for updates on the issue for now.
Thanks for your work @mklim
I just tried against master (looks like the commit is not yet merged to stable), and it worked for me!
I just tried against master (looks like the commit is not yet merged to stable), and it worked for me!
here too, but with backgroundmessage register bug.
woprandi comment solves the issue for android, but how to solve the same issue for iOS?
A working workaround :
class MainActivity: FlutterActivity() { /* override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine); }*/ }
This works for me in Android.
We're on Flutter 1.12.13+hotfix.7 and facing this issue right now. Is this bug fixed in 1.12.13+hotfix.8?
We're on Flutter 1.12.13+hotfix.7 and facing this issue right now. Is this bug fixed in 1.12.13+hotfix.8?
I am running 1.12.13+hotfix.8 on stable and it still does not work. Installing fvm to switch between master and stable.
I'm running v1.12.13+hotfix.8 but with firebase_messaging: ^5.1.6 because when trying to update to v6.x the notifications on iOS stoped working. Not really sure where or what has the issue.
Still not working in flutter v1.12.13+hotfix.8 with firebase_messaging: ^6.0.12
Tried it with flutter v1.15.19 dev. It seems to work for me
https://storage.googleapis.com/flutter_infra/releases/dev/windows/flutter_windows_v1.15.19-dev.zip
Yes, the master branch seems fine
When will this be merged to Stable ? Any updates ? As of today, the problem still persist.
When will this be in the stable version?
firebase_messaging 6.0.13
Flutter (Channel master, v1.16.4-pre.52, on Microsoft Windows [Version 6.3.9600], locale en-US)
@p30arena the version 6.0.13 is correct ? i'm using and still calling twice in the onResume and others...
@lucas-sesti
maybe you should check your server logic,
I've tested it in two production apps on Android and iOS.
But in not stable channel of flutter alright? I'm using the Stable channel, now i see you said:
"Flutter (Channel master, v1.16.4-pre.52, on Microsoft Windows [Version 6.3.9600], locale en-US)"...
Hi, any ideas when this will be merge to stable?
Any ETA on the merge to stable? :)
Not resolved with flutter 1.12.13+hotfix.9.
Any news about merging into stable version ?
This is very serious issue. Is there there any work around, we have an urgent release.
Please help
Hello guys. I think, after flutter upgrade to 1.12, you need to migrate your projects following this guide: https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects#full-flutter-app-migration
body of the MainActivity is now empty
The new FlutterActivity no longer requires manually registering your plugins. It will now perform the registration automatically when the underlaying FlutterEngine is created.
I'm doing something like this:
if ((DateTime.now().microsecondsSinceEpoch - _lastOnResumeCall) > 1000000) {
_lastOnResumeCall = DateTime.now().microsecondsSinceEpoch;
_navigateToItemDetail(message);
}
Essentially testing how long since the callback was last reached. If some amount of time has passed we proceed.
Fixed and working well on flutter beta. Thanks @mklim!
Any ETA on a fix for this? Still happening on the latest flutter version.
Fixed and working well on flutter beta. Thanks @mklim!
I'm on beta. Still facing the same issue.
Hello guys. I think, after flutter upgrade to 1.12, you need to migrate your projects following this guide: https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects#full-flutter-app-migration
body of the MainActivity is now empty
The new FlutterActivity no longer requires manually registering your plugins. It will now perform the registration automatically when the underlaying FlutterEngine is created.
Following migration guide resolved this problem for me ;) Thx !
Got this issue on iOS too!
firebase_crashlytics: ^0.1.3+3
Xcode build done. 70.7s
Configuring the default Firebase app...
[Crashlytics] Version 3.14.0 (144)
Configured the default Firebase app __FIRAPP_DEFAULT.
**[Fabric] [Fabric +with] called multiple times. Only the first call is honored, please pass all kits you wish to initialize**
[GoogleDataTransport][I-GDTCOR001006] (/Users/xxxxxxxxxx/ios/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m:59) : There was an error saving the new counter value to disk.
[GoogleDataTransport][I-GDTCOR001006] (/Users/xxxxxxxxxx/ios/Pods/GoogleDataTransport/GoogleDataTransport/GDTCORLibrary/GDTCOREvent.m:59) : There was an error saving the new counter value to disk.
WARNING: OneSignal has detected that your application delegate implements a deprecated method (application:didReceiveLocalNotification:). Please note that this method has been officially deprecated and the OneSignal SDK will no longer call it. You should use UNUserNotificationCenter instead
WARNING: OneSignal has detected that your application delegate implements a deprecated method (application:didReceiveLocalNotification:). Please note that this method has been officially deprecated and the OneSignal SDK will no longer call it. You should use UNUserNotificationCenter instead
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.12.13+hotfix.9, on Mac OS X 10.14.5 18F132,
locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 11.3)
[!] Android Studio (version 3.6)
✗ Flutter plugin not installed; this adds Flutter specific functionality.
✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.44.2)
[✓] Connected device (1 available)
! Doctor found issues in 1 category.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// setup OneSignal
await AppNotificationsManager.initializeOneSignal();
// setup Crashlytics.
setUpCrashlytics();
runZoned(() {
runApp(MyApp());
}, onError: Crashlytics.instance.recordError);
}
void setUpCrashlytics() {
// Set `enableInDevMode` to true to see reports while in debug mode
// This is only to be used for confirming that reports are being
// submitted as expected. It is not intended to be used for everyday
// development.
Crashlytics.instance.enableInDevMode = false;
// Pass all uncaught errors from the framework to Crashlytics.
FlutterError.onError = Crashlytics.instance.recordFlutterError;
}
Flutter 1.7 was released to the stable channel, which should include a fix to this bug.
Wow you're actually correct.. Flutter 1.17.0 was released to stable channel. I just updated to latest hotfix 2 days ago!
The Android issue originally mentioned here has been fixed on all Flutter channels at this point, so I'm going to close this as fixed.
From some of the comments I suspect that over time there may have been multiple issues reported in this issue. If you're on the latest stable version of Flutter (currently v1.17.0) and still seeing this behavior, please file a new issue.
A working workaround :
class MainActivity: FlutterActivity() { /* override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine); }*/ }
this solution was so great ... but it makes some issues with other packages like image picker
the wrong with my code was that I was calling the firebase init method in the build method
of the application and that was the cause of duplication because the build method maybe
called more than one time.
the solution for me was to call the firebase init method in the initState() method of Widget that will
enable init of firebase to be called only onetime and that prevent the duplication.
that works for me I hope for all too
A working workaround :
class MainActivity: FlutterActivity() { /* override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine); }*/ }this solution was so great ... but it makes some issues with other packages like image picker
the wrong with my code was that I was calling the firebase init method in the build method
of the application and that was the cause of duplication because the build method maybe
called more than one time.
the solution for me was to call the firebase init method in the initState() method of Widget that will
enable init of firebase to be called only onetime and that prevent the duplication.that works for me I hope for all too
Could you explain it with your code,because your explanatin is kind of confusing me...
What I want to say it that
You do not need to comment this code in the MainActiviy
class MainActivity: FlutterActivity() {
/* override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}*/
}
just initialize the firebase in the initState() function instead of build() function
that prevented the duplicated notification for me
This is the perfect code for this issue.
Just we need to do is to declare a static bool variable, It will work with onResume().
Before only some logic is missing, that's why it is calling twice.
static bool isNotified=false;
onMessage:
// ignore: missing_return
(Map<String, dynamic> msg) {
if(!isNotified)
{
print("onMessage called");
print(msg);
DocumentReference documentReference =
Firestore.instance.collection('PushNotifications').document();
documentReference.setData({
"payload": msg
});
}
isNotified = !isNotified;
}
@samyu99
@woprandi

I can confirm that this issue is fixed if you create a new project using Flutter version 1.17.4.
For the record I'm using firebase_messaging: ^6.0.9
I can confirm that this issue is fixed if you create a new project using Flutter version 1.17.4.
For the record I'm using firebase_messaging: ^6.0.9
still same getting bug
Use bool variable ,it is working perfect for me.
static bool isNotified=false;
onMessage: // ignore: missing_return (Map<String, dynamic> msg) { if(!isNotified) { print("onMessage called"); print(msg); DocumentReference documentReference = Firestore.instance.collection('PushNotifications').document(); documentReference.setData({ "payload": msg }); } isNotified = !isNotified; }
@kharisazhar
For me, works on update Flutter version 1.17.5 and firebase_messaging: ^6.0.16
I'm facing the same issue on iOS
Still facing the same issue on both Android and iOS. I'm using firebase_messaging: ^6.0.16 and Flutter 1.17.5.
I think I solved the issue.But I need to be sure as to what steps you are following.Those who have the issue please reply to this comment with the steps by step procedure...
@Chethansmash7
flutter: onMessage: {body: Body, google.c.sender.id: 276852428296, google.c.a.e: 1, click_action: FLUTTER_NOTIFICATION_CLICK, aps: {alert: {title: Title, body: Test notification}, content-available: 1}, title: title, gcm.message_id: 1594807744573443, priority: high, content_available: true, gcm.notification.priority: high}
flutter: onMessage: {click_action: FLUTTER_NOTIFICATION_CLICK, google.c.sender.id: 276852428296, google.c.a.e: 1, content_available: true, aps: {alert: {title: Title, body: Test notification}, content-available: 1}, title: title, gcm.message_id: 1594807744573443, body: Body, priority: high, gcm.notification.priority: high}
Flutter doctor
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.5 19F101, locale en-US)
• Flutter version 1.17.5 at /Users/cico/src/flutter
• Framework revision 8af6b2f038 (2 weeks ago), 2020-06-30 12:53:55 -0700
• Engine revision ee76268252
• Dart version 2.8.4
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
• Android SDK at /Users/cico/Library/Android/sdk
• Platform android-30, build-tools 30.0.0
• ANDROID_SDK_ROOT = /Users/cico/Library/Android/sdk
• Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 11.5)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 11.5, Build version 11E608c
• CocoaPods version 1.9.3
[✓] Android Studio (version 4.0)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin version 47.1.2
• Dart plugin version 193.7361
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
Can you share your solution?
I've noticed that the callback onMessage got called twice in FLTFirebaseMessagingPlugin.m
commenting out
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}
did the trick.
But obviously it is just a work around, I'm not aware of the possible repercussions.
The flow is:
(BOOL)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandlervoid)didReceiveRemoteNotification:(NSDictionary *)userInfo- (void)userNotificationCenter:(UNUserNotificationCenter *)center
willPresentNotification:(UNNotification *)notification
withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
NS_AVAILABLE_IOS(10.0) get called[_channel invokeMethod:@"onMessage" arguments:userInfo] I tried @fnicastri's workaround and it works for onMessage, but onResume is still called twice on iOS. onResume is called when the app is _still in the background_ as well as when the app is brought to the foreground. Is it supposed to be this way? From reading the documentation, I thought onResume will only be called when the app is brought to the foreground, and not when it's in the background too.
@rivetingpeppermint @TahaTesser
Yes, digging more I noticed the same issue.
This is a serious issue that makes notifications unusable.
I also just found out that when I run my app on iOS, onResume and onLaunch are called when we open the app normally (from the home screen, not from clicking the notification in the system tray). This behavior doesn't happen with Android. I used the iPad Pro (9.7-inch, running iOS 13.5.1) and iPhone 7 (running iOS 12.4.1).
@TahaTesser
Thanks for reopening this bug.
you could change the platform tag too and maybe the title.
I confirm it's only on Android
it on iOS too
Does anyone have a workaround for this problem yet?
Does anyone have a workaround for this problem yet?
init firebase only once, it worked for me
Does anyone have a workaround for this problem yet?
init firebase only once, it worked for me
Can you explain it?
It's fixed with the new version. I'm using this current configuration: (Don't use carets it's not good)
firebase_core: 0.5.0
firebase_auth: 0.18.0
firebase_messaging: 7.0.0
Be aware there is now some additional Android setup 👎
@ollydixon what additional setup?
@rivetingpeppermint ahh sorry, it's on the github/pub page.
@ollydixon @TahaTesser
It's fixed with the new version. I'm using this current configuration: (Don't use carets it's not good)
firebase_core: 0.5.0 firebase_auth: 0.18.0 firebase_messaging: 7.0.0Be aware there is now some additional Android setup 👎
It's not.
I still get onResume called twice on iOS. On Android it's fine now (no additional setup needed)
And if I add
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}
I get nothing at all.
Using the example I get onMessage twice and onResume once.
Something is not working at all even with this new release.
firebase_core: 0.5.0
firebase_auth: 0.18.0
firebase_messaging: 7.0.0
I am getting same issue at iOS.
Having the same issue on IOS for onMessage and onResume.
If it can help the second message object have the same informations as the first one but in different order like this :
{sender: , google.c.sender.id: *, google.c.a.e: , click_action: FLUTTER_NOTIFICATION_CLICK, aps: {alert: {title: , body: }, sound: , content-available: }, sound: , content_available: , priority: , gcm.message_id: , gcm.notification.priority: *}
{click_action: FLUTTER_NOTIFICATION_CLICK, sender: , google.c.a.e: *, google.c.sender.id: , aps: {alert: {title: e, body: }, sound: default, content-available: 1}, sound: , gcm.message_id: , priority: , content_available: , gcm.notification.priority: *}
Same issue here, using flutter v. 1.22.0 and firebase messaging 7.0.3, this behavior happens when I use "content-available": true
@salva73
Could you please file a new issue with all the steps
Most helpful comment
A working workaround :