Фон приложения для push-уведомлений Flutter: firebase_messaging

Я хочу отображать push-уведомление, когда мое приложение работает в фоновом режиме.
Я использую flutter_local_notifications пакет и firebase_messaging пакет.

Push-уведомления отлично работают с firebase_messaging и когда мое приложение работает в фоновом режиме.
Однако метод ниже:

       // The following handler is called, when App is in the background.
 FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);

не вызывается, если RemoteNotification объект передается через RemoteMessage :

      Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  print('message from background handler');
  print("Handling a background message: ${message.messageId}");
  
  // If this is null, then this handler method is called
  RemoteNotification remoteNotification = message.notification; 

  showNotificationFromData(message.data);
}

Поэтому я должен сдать message.data объект, который является Map<String, dynamic>.

Моя проблема в том, что я больше не получаю push-уведомление при вызове этого метода обработчика.

Итак, я пытался использовать flutter_local_notification пакет для отображения push-уведомления, но, как говорится, он «локальный», поэтому он отлично работает на переднем плане, но, по-видимому, не в фоновом режиме (тот же код с теми же данными не отображается в фоновом режиме как push-уведомление).

Вопрос :

Мне нужно позвонить в firebaseMessagingBackgroundHandlerобработчик для обработки событий в моем приложении. Могу я сделать так, чтобы push-уведомления продолжались, когда мое приложение работает в фоновом режиме, пожалуйста?

Спасибо

2 ответа

Решение

Хорошо, я нашел решение. Это было установить content_available ценность для True в коде на стороне сервера.

Чтобы заменить firebase_messaging.Notification элемент, нам нужно переопределить android а также apns конфиги.

В Python это выглядит так:

      apnsConfig = messaging.APNSConfig(
            payload=messaging.APNSPayload(
                aps=messaging.Aps(
                    content_available=True,
                )
            ),
     
        )

Теперь я получаю push-уведомления и вызываю фоновый обработчик внутри кода дротика.

Я знаю это слишком поздно, но если кто-то пытается получить пользовательское уведомление с помощью firebase, то вот решение

Для Android (флаттер)

В Android сообщения с уведомлениями отправляются в каналы уведомлений , которые используются для управления доставкой уведомлений. Используемый по умолчанию канал FCM скрыт от пользователей, однако обеспечивает уровень важности «по умолчанию». Для всплывающих уведомлений требуется «максимальный» уровень важности.

Это означает, что нам нужно сначала создать новый канал с максимальным уровнем важности, а затем назначить этому каналу входящие уведомления FCM. мы можем воспользоваться пакетом

  1. Добавить flutter_local_notificationspackage в свой локальный проект.
  2. Создайте новый экземпляр AndroidNotificationChannel:
      const AndroidNotificationChannel channel = AndroidNotificationChannel(
  'high_importance_channel', // id
  'High Importance Notifications', // title
  'This channel is used for important notifications.', // description
  importance: Importance.max,
);

(имейте в виду, что это пример кода, но вы можете настроить уведомление с помощью кода канала уведомлений)

  1. Создайте канал на устройстве:
      final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

    await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);
  1. После создания мы можем обновить FCM, чтобы использовать наш собственный канал, а не канал FCM по умолчанию. Для этого откройте android/app/src/main/AndroidManifest.xmlфайл для вашего проекта FlutterProject. Добавьте следующее meta-dataсхема внутри applicationсоставная часть:
          <meta-data
      android:name="com.google.firebase.messaging.default_notification_channel_id"
      android:value="high_importance_channel" />

теперь всякий раз, когда вы отправляете уведомление, укажите идентификатор своего канала, и ваше приложение автоматически покажет ваше пользовательское уведомление (через консоль API или Firebase)

      {
   "message":{
      "token":"token_1",
      "android_channel_id":"high_importance_channel" //specify channel id here
      "data":{},
      "notification":{
        "title":"FCM Message",
        "body":"This is an FCM notification message!",
      }
   }
}

что касается ios , они не поддерживают канал уведомлений, у меня нет необходимых ресурсов и информации о том, как все работает, если вы, ребята, знаете, комментарий ниже будет очень признателен

Другие вопросы по тегам