Flutter: Foreground notification is not working in firebase messaging

16,051

Solution 1

You can find the answer in FlutterFire documentation https://firebase.flutter.dev/docs/migration/#messaging

You just add to your code the following line

    FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(alert: true, badge: true, sound: true);

Solution 2

There is an active issue logged on GitHub repository for the package regarding the same. Firebase messaging and local notifications won't work together on iOS since you can register only a single delegate for notifications.

Check out: https://github.com/MaikuB/flutter_local_notifications/issues/111

There's also an active flutter issue for the same: https://github.com/flutter/flutter/issues/22099

Solution 3

Problem: See the Push Notification while application is in foreground.

Solution: I was using firebase_message plugin and I was able to see the Push Notification while application is in foreground by making these few changes in my flutter project's iOS AppDelegate.swift file in flutter project.

import UIKit
import Flutter
import UserNotifications

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate, UNUserNotificationCenterDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    // set the delegate in didFinishLaunchingWithOptions
    UNUserNotificationCenter.current().delegate = self
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
    // This method will be called when app received push notifications in foreground
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    {
        completionHandler([.alert, .badge, .sound])
    }
}

Note: This also works while using with flutter_local_notification plugin but with an issue that onSelectNotification is not working due to changes done above.

Share:
16,051
Farhana Naaz Ansari
Author by

Farhana Naaz Ansari

Farhana... The only way of writing fewer bugs is writing less code.

Updated on June 15, 2022

Comments

  • Farhana Naaz Ansari
    Farhana Naaz Ansari almost 2 years

    I need to show firebase notifications when the app is on foreground by using local notification but it is not working.

      FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin=new FlutterLocalNotificationsPlugin();
    
      static  FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
      static StreamController<Map<String, dynamic>> _onMessageStreamController =
      StreamController.broadcast();
      static StreamController<Map<String, dynamic>> _streamController =
      StreamController.broadcast();
      static final Stream<Map<String, dynamic>> onFcmMessage =
          _streamController.stream;
    
      @override
      void initState() {
        super.initState();
    
        var android=AndroidInitializationSettings('mipmap/ic_launcher.png');
        var ios=IOSInitializationSettings();
        var platform=new  InitializationSettings(android,ios);
        flutterLocalNotificationsPlugin.initialize(platform);
    
        firebaseCloudMessaging_Listeners();
      }
    

    Here is the Firebase Code

     void firebaseCloudMessaging_Listeners() {
    
    if (Platform.isIOS) iOS_Permission();
    
    _firebaseMessaging.getToken().then((token) {
      print("FCM TOKEN--" + token);
    });
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print('on message $message');
        showNotification(message);
      },
      onResume: (Map<String, dynamic> message) async {
        print('on resume $message');
      },
      onLaunch: (Map<String, dynamic> message) async {
        print('on launch $message');
      },
    );
    
    
    }
    

    This is showNotification method

     void showNotification(Map<String, dynamic> msg) async{
        print(msg);
        var android = new AndroidNotificationDetails(
            'my_package', 'my_organization', 'notification_channel', importance: Importance.Max, priority: Priority.High);
        var iOS = new IOSNotificationDetails();
        var platform=new NotificationDetails(android, iOS);
        await flutterLocalNotificationsPlugin.show(
          0,'My title', 'This is my custom Notification', platform,);
      }
    

    and Firebase Response

    {notification: {title: Test Title, body: Test Notification Text}, data: {orderid: 2, click_action: FLUTTER_NOTIFICATION_CLICK, order name: farhana}}