Flutter: Плагин локальных уведомлений, показывающий уведомление дважды

# #android #firebase #flutter #push-notification #flutter-local-notification

Вопрос:

Я получаю уведомление от своего сервера в определенное время, чтобы показать пользователям уведомление. Однако всякий раз, когда мое устройство получает сообщение от Firebase Cloud Messaging FlutterLocalNotificationsPlugin , в конечном итоге отображаются два уведомления, как показано ниже.

введите описание изображения здесь

Я уже подтвердил, что получаю одно уведомление от своего сервера, просто я думаю, что где-то в интерфейсе оно обрабатывается неправильно.

Вот мой код, в котором я вызываю это в фоновом режиме

main

 Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  // If you're going to use other Firebase services in the background, such as Firestore,
  // make sure you call `initializeApp` before using other Firebase services.
  await Firebase.initializeApp();
  print('Handling a background message ${message.messageId}');
  if (message.notification != null) {
    print(message.notification.title);
    print(message.notification.body);
    flutterLocalNotificationsPlugin.show(
        message.notification.hashCode,
        message.notification.title,
        message.notification.body,
        NotificationDetails(
          android: AndroidNotificationDetails(
            channel.id,
            channel.name,
            channel.description,
            icon: 'launch_background',
          ),
          iOS: IOSNotificationDetails()
        ));
  }

  // Create a notification for this
}


const AndroidNotificationChannel channel = AndroidNotificationChannel(
  'high_importance_channel', // id
  'High Importance Notifications', // title
  'This channel is used for important notifications.', // description
  importance: Importance.high,
);

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

// Starting FlutterFire through the suggestion found here
// https://firebase.flutter.dev/docs/overview
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  /// Create an Android Notification Channel.
  /// We use this channel in the `AndroidManifest.xml` file to override the
  /// default FCM channel to enable heads up notifications.
  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  /// Update the iOS foreground notification presentation options to allow
  /// heads up notifications.
  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  User _user;
  FirebaseAnalytics analytics;
  bool _error = false;

  void _handleLogin(User user) {
    // print("Handle Login");
    setState(() {
      _user = user;
    });
  }

  @override
  void initState() {
    super.initState();

    // if we opened the app through a notification, it will send us via this
    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      print('On Message Opened!');
      print(message);
    });
  }

  @override
  Widget build(BuildContext context) {
   }
}


 

Ответ №1:

На всякий случай, если кто-то наткнется на ту же проблему. Я перечитал документацию по FlutterFire, где упоминается, есть ли у вас текущий обновленный SDK Flutter и Firebase, затем он попытается отобразить его автоматически. Моя ошибка заключалась в том, что я реализовал FlutterLocalNotifications в дополнение к этому, и я получал два уведомления, одно из которых было ручным, а другое автоматическим.

При отправке сообщения на устройство убедитесь, что это notification не «а», а «а data «. В документации упоминается, что если вы отправите data его, оно, скорее всего, будет проигнорировано как push-уведомление. Вместо этого используйте его только для отправки пакетов данных в приложение.

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

1. Есть ли способ notification вручную обработать тип для IOS? значит, он не отображается автоматически?

2. В этом случае вы захотите отправить свое уведомление как data тип, а не notification как . Вы можете выбрать, чтобы вручную отобразить его с помощью FlutterLocalNotifications

3. да, я знаю, что данные не запускаются автоматически. но, к сожалению, я не могу изменить это со стороны сервера и хочу обработать это со стороны Flutter.

Ответ №2:

Комментирование этой части кода решает проблему.

/// Обновите параметры представления уведомлений на переднем плане iOS, чтобы разрешить /// уведомления о начале. ожидать

FirebaseMessaging.instance.setforegroundnotificationпредставленияопции( предупреждение: верно, значок: верно, звук: верно, );

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

1. Не работает в моем случае