В этом руководстве описывается, как настроить Firebase Cloud Messaging в мобильных и веб-клиентских приложениях, чтобы вы могли надежно получать сообщения.
Для получения сообщений вы можете использовать службу, расширяющую 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 отображает и использует пользовательский значок по умолчанию для
- Все уведомительные сообщения, отправленные из редактора уведомлений .
- Любое уведомительное сообщение, которое явно не устанавливает значок в полезной нагрузке уведомления.
Если пользовательский значок по умолчанию не установлен и значок не установлен в полезной нагрузке уведомления, 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()
. При получении этого обратного вызова экземпляр приложения должен выполнить полную синхронизацию с вашим сервером приложений. Если вы не отправляли сообщение приложению на этом устройстве в течение последних 4 недель, FCM не вызовет onDeletedMessages()
.
Обработка уведомлений в фоновом режиме приложения
Когда приложение работает в фоновом режиме, Android направляет уведомления в системный трей. При нажатии на уведомление по умолчанию открывается панель запуска приложений.
Это включает сообщения, содержащие как уведомления, так и данные (а также все сообщения, отправленные из консоли уведомлений). В этих случаях уведомление доставляется в системный трей устройства, а данные — в дополнительные элементы, соответствующие цели вашего приложения-запуска.
Дополнительную информацию о доставке сообщений в ваше приложение можно найти на панели отчетности FCM , где регистрируется количество отправленных и открытых сообщений на устройствах Apple и Android, а также данные о «показах» (уведомлениях, увиденных пользователями) для приложений Android.