Флаттер облачных сообщений настраиваемый звук уведомления не работает, когда приложение находится в фоновом режиме

#flutter

Вопрос:

В моем приложении flutter есть пользовательский тон уведомления, который отлично работает, когда приложение находится на переднем плане. Но когда я закрываю приложение или оставляю его в фоновом режиме, приходят уведомления, но нет настраиваемого звука уведомления. флаттер версии 2.0, флаттер_local_notifications: ^5.0.0 firebase_messaging: ^10.0.4 . Это мой код. Кто-нибудь может помочь мне избавиться от этой ошибки? Спасибо

  Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
      await Firebase.initializeApp();
      print('Handling a background message ${message.messageId}');
    }

    AndroidNotificationChannel channel;
    FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
      FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
      if (!kIsWeb) {
        channel = const AndroidNotificationChannel(
          'high_importance_channel',
          'High Importance Notifications',
          'This channel is used for important notifications.',
          importance: Importance.high,
          enableLights: true,
          sound: RawResourceAndroidNotificationSound('notification'),
          playSound: true,
          enableVibration: true,
        );
        flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
        await flutterLocalNotificationsPlugin
            .resolvePlatformSpecificImplementation<
                AndroidFlutterLocalNotificationsPlugin>()
            ?.createNotificationChannel(channel);
        await FirebaseMessaging.instance
            .setForegroundNotificationPresentationOptions(
          alert: true,
          badge: true,
          sound: true,
        );
      }
      runApp(new MaterialApp(
        home: MyApp(),
        debugShowCheckedModeBanner: false,
        routes: <String, WidgetBuilder>{},
      ));
    }


     initializeFCM() async {
    FirebaseMessaging.onMessageOpenedApp.listen((message) {
      print('Message clicked!');
    });
    messaging = FirebaseMessaging.instance;

    messaging.subscribeToTopic("messaging");
    messaging.getToken().then((value) async {
     
      print("FirebaseToken:"   value);
      var token = await getSharedPrefrence('token');
      var notiToken = await sharedPrefrence('notiToken', value.toString());
      if (token != null) {
        var sendToken = await sendNotiTokenApi(value.toString());
      }
     
      print(notiToken);
    });
    final sound = "notification.mp3";
    FirebaseMessaging.onMessage.listen(
      (RemoteMessage message) {
        RemoteNotification notification = message.notification;
        AndroidNotification android = message.notification?.android;
        if (notification != null amp;amp; android != null amp;amp; !kIsWeb) {
          flutterLocalNotificationsPlugin.show(
              notification.hashCode,
              notification.title,
              notification.body,
              NotificationDetails(
                android: AndroidNotificationDetails(
                  channel.id,
                  channel.name,
                  channel.description,
                  icon: 'launch_background',
                  importance: Importance.max,
                  priority: Priority.max,
                  enableLights: true,
                  enableVibration: true,
                  playSound: true,
                  sound: RawResourceAndroidNotificationSound('notification'),
                ),
              ));
        }

        showDialog(
            context: context,
            builder: (BuildContext context) {
              return AlertDialog(
                title: Text("Notification"),
                content: Text(message.notification.body),
                actions: [
                  TextButton(
                    child: Text("Ok"),
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                  )
                ],
              );
            });
      },
    );
  }

  void showNotification(message) async {
    var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
      Platform.isAndroid
          ? 'com.dfa.flutterchatdemo'
          : 'com.duytq.flutterchatdemo',
      'Flutter chat demo',
      'your channel description',
      playSound: true,
      enableVibration: true,
      sound: RawResourceAndroidNotificationSound('notification'),
      importance: Importance.max,
      enableLights: true,
      priority: Priority.high,
    );
    var iOSPlatformChannelSpecifics = new IOSNotificationDetails();
    var platformChannelSpecifics = new NotificationDetails(
        android: androidPlatformChannelSpecifics,
        iOS: iOSPlatformChannelSpecifics);

   
    print(
      message['notification']['title'].toString(),
    );
  
    

    await flutterLocalNotificationsPlugin.show(
        0,
        message['notification']['title'].toString(),
        message['notification']['body'].toString(),
        platformChannelSpecifics,
        payload: 'test'
        // payload: json.encode(message)
        );
  }

  void configLocalNotification() {
    var initializationSettingsAndroid =
        new AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsIOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(
        iOS: initializationSettingsIOS, android: initializationSettingsAndroid);
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
  }
 

Ответ №1:

Для onMessage вы вручную отправляете настроенное уведомление с помощью flutterLocalNotificationsPlugin.show, но для _firebaseMessagingBackgroundHandler используется толкатель уведомлений по умолчанию.

Исправить:
Вы можете попробовать ввести необходимые объекты и настроить их, как текущий flutterLocalNotificationsPlugin.показать

Комментарии:

1. когда я скопировал flutterLocaNotificationsPlugin. покажите, что я получаю это сообщение об ошибке: Сообщение FlutterFire: Произошла ошибка в вашем обработчике фоновых сообщений: noSuchMethod Ошибка: Идентификатор получателя был вызван с нулевым значением.