| Выберите платформу: | iOS+ Android Веб Flutter Unity C++ |
Чтобы получать сообщения, можно использовать сервис, который расширяет возможности FirebaseMessagingService.
Ваш сервис должен переопределять функции обратного вызова onMessageReceived и onDeletedMessages. Полный пример можно найти в кратком руководстве по Firebase Cloud Messaging.
onMessageReceived доступен для большинства типов сообщений, за исключением следующих:
Уведомления, доставленные, когда приложение работает в фоновом режиме. В этом случае уведомление будет доставлено в область уведомлений устройства. По умолчанию при нажатии на уведомление открывается панель запуска приложений.
Сообщения с полезной нагрузкой уведомлений и данных, полученные в фоновом режиме. В этом случае уведомление доставляется в область уведомлений устройства, а полезная нагрузка данных – в дополнительных параметрах интента вашего приложения.
В целом можно выделить следующее.
| Состояние приложения | Уведомление | Данные | Оба варианта |
|---|---|---|---|
| В активном режиме | onMessageReceived |
onMessageReceived |
onMessageReceived |
| Общая информация | Область уведомлений | onMessageReceived |
Уведомление: область уведомлений. Данные: в дополнительных параметрах намерения. |
Подробнее об уведомлениях и сообщениях с данными…
У обратного вызова onMessageReceived короткий период выполнения. На продолжительность этого периода влияет множество факторов, в том числе задержки ОС, время запуска приложения, блокировка основного потока другими операциями или слишком долгое выполнение предыдущих вызовов onMessageReceived.
Поэтому в методе onMessageReceived не следует выполнять длительные задачи, например загружать изображения с сервера для показа в уведомлении. Вместо этого запланируйте задачу с помощью метода WorkManager, чтобы выполнить все задачи, которые могут занять более нескольких секунд. Подробнее об обработке сообщений с высоким и обычным приоритетом…
Как изменить манифест приложения
Чтобы использовать FirebaseMessagingService, добавьте в манифест приложения следующие строки:
<service
android:name=".java.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Рекомендуем задать значения по умолчанию, чтобы настроить внешний вид уведомлений. Вы можете указать значок и цвет по умолчанию, которые будут использоваться, если в полезной нагрузке уведомления не заданы эквивалентные значения.
Добавьте эти строки в тег application, чтобы задать пользовательский значок по умолчанию и пользовательский цвет:
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
Android показывает и использует пользовательский значок по умолчанию для:
Все уведомления, отправленные из конструктора уведомлений в консоли Firebase.
Любое уведомление, в полезной нагрузке которого не задан значок.
Если значок по умолчанию не задан и в полезной нагрузке уведомления нет значка, Android показывает значок приложения, отрисованный белым цветом.
Переопределить onMessageReceived
Переопределив метод FirebaseMessagingService.onMessageReceived, вы можете выполнять действия на основе полученного объекта RemoteMessage и получать данные сообщения:
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Переопределить onDeletedMessages
В некоторых случаях FCM не доставляет сообщения. Это происходит, когда для вашего приложения на определенном устройстве в момент подключения ожидают доставки слишком много сообщений (>100) или если устройство не подключалось к FCM более месяца. В таких случаях вам могут перезвонить по номеру FirebaseMessagingService.onDeletedMessages(). Когда экземпляр приложения получает этот обратный вызов, он должен выполнить полную синхронизацию с сервером приложения. Если вы не отправляли сообщения в приложение на этом устройстве в течение последних четырех недель, FCM не будет звонить onDeletedMessages().
Как обрабатывать сообщения-уведомления в свернутом приложении
Когда приложение работает в фоновом режиме, Android направляет уведомления в область уведомлений. По умолчанию при нажатии на уведомление открывается панель запуска приложений.
К ним относятся сообщения, содержащие как уведомление, так и полезную нагрузку данных (и все сообщения, отправленные из инструмента создания уведомлений в консоли Firebase). В таких случаях уведомление доставляется в область уведомлений устройства, а полезная нагрузка данных – в дополнительных параметрах интента вашего приложения.
Чтобы узнать, как сообщения доставляются в ваше приложение, откройте раздел DevOps и вовлеченность > Обмен сообщениями > Отчеты на панели управления Firebase. На этой панели управления регистрируется количество сообщений, отправленных и открытых на устройствах Apple и Android, а также данные о показах (уведомлениях, которые видели пользователи) для приложений Android.