Фон приложения для 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. мы можем воспользоваться пакетом
- Добавить
flutter_local_notifications
package в свой локальный проект. - Создайте новый экземпляр AndroidNotificationChannel:
const AndroidNotificationChannel channel = AndroidNotificationChannel(
'high_importance_channel', // id
'High Importance Notifications', // title
'This channel is used for important notifications.', // description
importance: Importance.max,
);
(имейте в виду, что это пример кода, но вы можете настроить уведомление с помощью кода канала уведомлений)
- Создайте канал на устройстве:
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
- После создания мы можем обновить 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 , они не поддерживают канал уведомлений, у меня нет необходимых ресурсов и информации о том, как все работает, если вы, ребята, знаете, комментарий ниже будет очень признателен