firebase_messaging onResume and onLaunch not working
Solution 1
lost my 2 days to fix this issue, it may helpful for you. notification tag only for showing notification. you can access only data content on onResume/onLaunch.
If you want handle notification message inside onResume/onLaunch add those messages in data tag also, Then you can do what ever you want.
refer more detail on this link
send this notification message
{
"notification": {
"body": "body",
"title": "title"
},
"priority": "high",
"data": {
"body": "body",
"title": "title"
"click_action": "FLUTTER_NOTIFICATION_CLICK",
"id": "1",
"status": "done",
"image": "https://ibin.co/2t1lLdpfS06F.png",
},
"to": <your token>
}
you will receive below information onResume or onLaunch, your notification tag will be empty here
{notification: {}, data: {image: https://ibin.co/2t1lLdpfS06F.png, google.original_priority: high, google.sent_time: 1560858283888, google.delivered_priority: high, body: body , title: title, click_action: FLUTTER_NOTIFICATION_CLICK, google.message_id: 0:1560858283908500%eefdc741eefdc741, collapse_key: <package>, google.ttl: 2419200, from: <from>, id: 1, status: done}}
you can use title and body which is added in data tag.
Solution 2
In my case, onResume
and onLoad
were not firing because I was missing click_action: 'FLUTTER_NOTIFICATION_CLICK'
under the notification
property, not the data
property.
Once I changed my payload to be in the following format, onResume
and onLoad
started firing for me.
{
notification: {
title: 'Title',
body: 'Body',
click_action: 'FLUTTER_NOTIFICATION_CLICK'
}
}
I found this documented here.
If you are setting this in TypeScript (possibly others), it will be necessary to set this via the message's android.notification.clickAction
property. Otherwise, you may receive errors about the property being invalid. An example of this with a MulticastMessage
is as follows. Note that it doesn't show message construction from start to finish; only enough to show the context for setting clickAction
.
// Initialize the notification
const notification: admin.messaging.Notification = {
title: 'Hello',
// Though the "clickAction" property is available here, it throws an error about
// having an invalid property when actually trying to send the notification.
// Instead, the "clickAction" property is set further downstream under the
// MulticastMessage.android.notification object.
// clickAction: 'FLUTTER_NOTIFICATION_CLICK'
};
// Do other things to build your notification
const message: admin.messaging.MulticastMessage = {
tokens: [],
notification: notification
};
// Do other things to build your message
// If a notification is being sent then set the click_action
if (message.notification) {
// Combine with the existing message.android object, if one exists
message.android = message.android || {};
message.android.notification = Object.assign(message.android.notification || {}, {
clickAction: 'FLUTTER_NOTIFICATION_CLICK'
});
}
Solution 3
On the documentation of the firebase_messaging package in this section link to plugin docs they say you need to include click_action: FLUTTER_NOTIFICATION_CLICK
as a "Custom data" key-value-pair in your server-side post request for your onResume
and Onlaunch
methods to be called.
For example here am using the php firebase admin sdk to send notifications to the FCM here is a code sample for sending a notification:
$factory = (new Factory)->withServiceAccount('path to firebase keys json file');
$messaging = $factory->createMessaging();
$deviceToken = $user->deviceToken;
$message = CloudMessage::withTarget('token', $deviceToken)
->withNotification(Messaging\Notification::create('title', 'body'))
->withData(['custom-data-key1' => 'custom-data-value1', 'custom-data-key2' => 'custom-data-value2', 'click_action'=>'FLUTTER_NOTIFICATION_CLICK']);
$messaging->send($message);
Solution 4
Your are probably missing some metadata in AndroidManifest (as your log tells you). You need to add the following to your manifest:
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>
It seems like a duplicate
Solution 5
The answer posted by Anand saga is correct
You need to add title and body in data section.Notification payload will be blank onResume and onLaunch although it was sent from backend nodejs API.
Below is the sample payload flutter is resolving to onResume:
on resume {notification: {}, data: {image: https://ibin.co/2t1lLdpfS06F.png, google.original_priority: normal, google.sent_time: 1577389234347, google.delivered_priority: normal, body: "Custom Body", type: OrderDetail, title: "Custom title", click_action: FLUTTER_NOTIFICATION_CLICK, google.message_id: 0:1577389234352165%dfef845edfef845e, collapse_key: <<App NAme>>, google.ttl: 2419200, from: 790713779055, id: "5e050c04c308f6abb5a60b2e"}}
Typical dart config will look like this.
firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print('on message ${json.encode(message['data']['title'])}');
redirectScreenOnLoad(message);
},
onResume: (Map<String, dynamic> message) async {
firebaseMessaging.onTokenRefresh;
print('on resume $message');
redirectScreenOnLoad(message);
},
onLaunch: (Map<String, dynamic> message) async {
firebaseMessaging.onTokenRefresh;
// await API.updateUserApiToGetFCMKey();
print('on launch $message');
redirectScreenOnLoad(message);
},
);
in redirectScreenOnLoad(String message) i am checking the input payload and redirecting to different screen
![Ajay Kumar](https://i.stack.imgur.com/SQHpb.jpg?s=256&g=1)
Ajay Kumar
I'm a Technical Lead Flutter in Pune, India. I am passionate about building excellent software that improves the lives of those around me.
Updated on September 01, 2021Comments
-
Ajay Kumar almost 3 years
I am getting the notification when the app is in the foreground but not when the app in the background. Also, I have google-ed/StackOverflow-ed for like 2 hours or more but able to resolves this.
My Configurations are :
firebase_auth: ^0.10.0 firebase_messaging: ^5.0.0
The manifest is like this:
The code is like this:
final notifications = new FirebaseMessaging(); class AppNotifications { static String fcmToken = ''; static Future<Null> init() async { appLogs("AppNotifications init"); notifications.requestNotificationPermissions(const IosNotificationSettings(sound: true, badge: true, alert: true)); await configure(); fcmToken = await notifications.getToken(); appLogs("FCM TOKEN : " + fcmToken); notifications.onTokenRefresh.listen((newToken) { fcmToken = newToken; appLogs("FCM TOKEN onTokenRefresh: " + fcmToken); }); await updateFCMToken(); } static Future<Null> configure() async { appLogs("AppNotifications Configure"); notifications.configure(onMessage: (msg) { appLogs('FCM onMessage: ' + msg.toString()); }, onLaunch: (lun) { appLogs('FCM onLaunch: ' + lun.toString()); }, onResume: (res) { appLogs('FCM onResume: ' + res.toString()); }); } static Future<Null> updateFCMToken() async { auth.currentUser.fcmToken = fcmToken; await updateUserInSharedPreference(); } }
I am calling the function like this:
class HomeScreenState extends State<HomeScreen> { @override void initState() { super.initState(); Future.delayed(Duration(milliseconds: 100), () async { await AppNotifications.init(); }); } ..... ....
I am using postman for sending the notification :
My logs :
**(App is Foreground)** I/flutter (31888): APPLOGS : FCM onMessage: {notification: {title: Test notification title, body: Test notification body}, data: {status: done, id: 1, foo: bar, click_action: FLUTTER_NOTIFICATION_CLICK}} **(App is Background)** W/FirebaseMessaging(31888): Missing Default Notification Channel metadata in AndroidManifest. Default value will be used.
Flutter doctor :
[✓] Flutter (Channel stable, v1.2.1, on Mac OS X 10.14.4 18E226, locale en-GB) • Flutter version 1.2.1 at /Users/Ajay/SDK/flutter • Framework revision 8661d8aecd (3 months ago), 2019-02-14 19:19:53 -0800 • Engine revision 3757390fa4 • Dart version 2.1.2 (build 2.1.2-dev.0.0 0a7dcf17eb) [✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3) • Android SDK at /Users/Ajay/Library/Android/sdk • Android NDK location not configured (optional; useful for native profiling support) • Platform android-28, build-tools 28.0.3 • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01) • All Android licenses accepted. [✓] iOS toolchain - develop for iOS devices (Xcode 10.2.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 10.2.1, Build version 10E1001 • ios-deploy 1.9.4 • CocoaPods version 1.6.0 [✓] Android Studio (version 3.3) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin version 34.0.1 • Dart plugin version 182.5215 • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01) [!] VS Code (version 1.33.1) • VS Code at /Applications/Visual Studio Code.app/Contents ✗ Flutter extension not installed; install from https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter [✓] Connected device (1 available) • ONEPLUS A5000 • b47e8396 • android-arm64 • Android 9 (API 28)
-
Anand saga about 5 yearsits launching my activity if place inside data tag. but onResume and onLoad not working.
-
Sandeep Chayapathi almost 5 yearsThis is the right answer! The
click_action
key needs to be inside thedata
object. Firebase is spectacularly undocumented. -
Aya Elsisy over 4 yearsit is working when click_action is n notification not data?
-
Argel Bejarano over 4 yearsthis is over Android, but in iOS [data] does not exist in the json, did you fix this also for iOS i have been with this for the last week works in onResume but fails on onLaunch
-
downlz over 4 yearsI didn't test this in iOS. Can you post the response you are getting in iOS from firebase messaging?
-
Argel Bejarano over 4 yearsjust make it work i needs to be call from initiState to work
-
M David over 4 yearstotally agreed with Anand Saga ,
-
moslem over 4 yearsIn some tutorials they mention "clickAction" that poses this problem
-
Naeem about 4 years@MDavid can you please tell me which route I put code of firebase init? I have add this but still not wroking. notifications are showing in background but onResume is not working..
-
M David about 4 years@Hayat I am not sure it is good practice or not if you want that you receive notification in any mode you have to add and receive the "Message", "Title" inside the "data" object as well. in short the "Notification" object will be used by OS and "data" object will be all yours. do let me know if didn't get my point.
-
Naeem about 4 yearsActuclly I am making video calling app I want start 'Incoming Call' screen on notification, in every mode.
-
M David about 4 years@Hayat add and read some custom tag in "data" object it will work in all mods
-
Naeem about 4 yearsThanks @MDavid can you give me an example, i try but I not able to find out.
-
M David about 4 years@Hayat A working Example which I am using and receiving it in every case
json { "notification": { "body": "Message String", "title": "Title String" }, "priority": "high", "data": { "click_action": "FLUTTER_NOTIFICATION_CLICK", "Custom_App_Action ": "Video Call", "Message": "Message String", "Title": "Title String" }, "to": "Device Token" }
-
Naeem about 4 years@MDavid okay, I have received data now i want to start my ringing screen on null context, becuase app in background. Please check: stackoverflow.com/questions/61700435/…
-
Hitesh sapra about 4 yearsWhere is redirectScreenOnLoad() function?
-
Argel Bejarano about 4 yearsit was a matter of configurations you need to do the steps in documentation completely and it gonna work
-
Shajeel Afzal about 4 yearsI am getting this error if I add it in the
notification
payload:Invalid JSON payload received. Unknown name "click_action" at \'message.notification\': Cannot find field.
-
cokeman19 almost 4 yearsI updated my answer to show an example of how we're setting it in code.
-
Roxx over 3 years@AnandSaga This is the one which i was looking for last few days. how did you created this json format. Do you have any sample code for the same.
-
Roxx over 3 yearscan you show us redirectScreenOnLoad function?