#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"
}
}
}