Как запустить функцию при получении уведомления с помощью Firebase Messaging ^ 8.0.0-dev.8 в Flutter?

#firebase #flutter #push-notification #firebase-cloud-messaging #android-notifications

# #firebase #flutter #push-уведомление #firebase-cloud-обмен сообщениями #android-уведомления

Вопрос:

Здравствуйте, я использую Flutter для создания своего приложения, и мне нужно показывать оповещение при получении нового уведомления.
Я использовал firebase_messaging 7.0.3 , но столкнулся с ошибкой onBackgroundMessage . Быстрый поиск в Google помог мне выяснить, что ошибка, которую я получал, еще не исправлена. Однако один из разработчиков опубликовал обновление 20 дней назад о новой версии пакета, которая исправила эту проблему.
В новой версии удалены старые обработчики onMessage и введены новые. Теперь они получили новые обработчики событий, которые возвращают потоки, но не смогли заставить их запускаться с помощью .listen() функции. Всякий раз, когда я получаю уведомление, я получаю это: D/FLTFireMsgReceiver(22032): broadcast received for message печатается в консоли, но код в .listen() не выполняется.

Вот ссылка на статью о Firebase Flutter, которая является руководством по использованию новой версии пакета. Вот мой код:

 ...
FirebaseMessaging.onMessage.listen((event) {
 // do something
});
FirebaseMessaging.onMessageOpenedApp.listen((event) {
 // do something
});
FirebaseMessaging.onBackgroundMessage((message) {
 // do something
 return;
 }
...
 

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

1. Я тоже сталкиваюсь с той же проблемой, смогли ли вы решить эту проблему??

2. В итоге я начал употреблять firebase_messaging: ^7.0.3 . Я исправил ошибку, которую я получал, добавив Future<void> myBackgroundMessageHandler(Map<String, dynamic> message) async {} в начало файла (под импортом) и установив onBackgroundMessage: myBackgroundMessageHandler . Теперь он работает отлично, и я еще не столкнулся ни с какой ошибкой.

Ответ №1:

Решение, которое я нашел для запуска событий, состояло в том, чтобы всегда вызывать:

 await FirebaseMessaging.instance.getToken();
 

сразу после

 await Firebase.initializeApp();
 

Как только я вызываю это, FirebaseMessaging.onMessage.listen событие перехватывается, как и ожидалось.

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

1. Кажется await , для getToken не требуется

2. спасибо, это было решение после нескольких дней поиска

3. FirebaseMessaging.onMessage.listen это ключ к работе, спасибо!

Ответ №2:

  • Я получал тот же журнал, когда мое приложение находилось в режиме ожидания для уведомления о данных с высоким приоритетом. Это связано с некоторой проблемой в плагине firebase-messaging.
  • Плагин Firebase_messaging внутренне использует JobIntentService для обработки фоновых уведомлений fcm
  • JobIntentService имеет одно ограничение в Android O или более поздних версиях: при выполнении задания оно будет подчиняться стандартным политикам JobScheduler. Задание не будет выполняться немедленно, пока устройство находится в режиме ожидания. (ссылка для ссылки)
  • Та же проблема была поднята в репозитории firebase_messaging git (ссылка на ошибку)

Решение

  • Один Signal (другой поставщик push-уведомлений) решил эту проблему, установив модифицированную версию JobIntentService. (Решение OneSignal)
  • На высоком уровне он использует блокировки пробуждения для уведомлений fcm с высоким приоритетом для запуска службы даже в Android O и выше.
  • Добавьте эти изменения запроса на извлечение в вашу ide, отредактировав соответствующие файлы.

TL; DR

Добавьте эти изменения запроса на извлечение в вашу среду разработки, отредактировав соответствующие файлы. Отправляйте уведомления о данных с высоким приоритетом.

Полезная нагрузка FCM:

 {
"message": {
    "token": "fcm_client_token",
    "data": {
        "title": "Hello",
        "body": "Test Message"
    },
    "android": {
        "priority": "high"
    }
}
 

}