Для сообщений, отправляемых на устройства Android, можно задать обычный или высокий приоритет. Доставка сообщений с обычным и высоким приоритетом работает следующим образом:
Обычный приоритет. Это приоритет по умолчанию для сообщений с данными и уведомлений. Сообщения с обычным приоритетом доставляются немедленно, если устройство не находится в спящем режиме. Если устройство находится в спящем режиме, доставка может быть отложена для экономии заряда батареи. Для менее срочных сообщений, таких как уведомления о новых письмах, синхронизация интерфейса или синхронизация данных приложения в фоновом режиме, выбирайте обычный приоритет выполнения.
Высокий приоритет.FCM пытается доставить сообщения с высоким приоритетом немедленно, позволяя FCM при необходимости выводить устройство из спящего режима и выполнять ограниченную обработку (включая очень ограниченный доступ к сети). Сообщения с высоким приоритетом обычно требуют взаимодействия пользователя с приложением или его уведомлениями.
Как выбрать между высоким и обычным приоритетом сообщений
Сообщения с обычным приоритетом подходят для общих обновлений, а с высоким – для срочных вопросов или действий, требующих немедленной доставки. Поскольку на время доставки сообщений с обычным приоритетом может влиять спящий режим, для большинства уведомлений, видимых пользователю, следует установить высокий приоритет, чтобы обеспечить их своевременную доставку. Например, уведомления о сообщениях в чате, проблемах с аккаунтом или доставке еды должны иметь высокий приоритет.
Обработка сообщений с высоким и обычным приоритетом
Для обработки полезной нагрузки сообщений как с высоким, так и с обычным приоритетом, полученных на устройстве Android, обработчику onMessageReceived дается несколько секунд. При этом для сообщений с высоким приоритетом выделяется немного больше времени, чем для сообщений с обычным приоритетом. Этого времени должно быть достаточно, чтобы сразу показать уведомление. Если вам нужно выполнить дополнительные действия, например загрузить изображение из хранилища устройства или вызвать серверы для сбора дополнительного контента, вам потребуется выполнить дополнительные шаги.
Метод onMessageReceived вызывается в отдельном рабочем потоке. Рекомендуется обрабатывать полезную нагрузку сообщения и сразу же показывать уведомление в методе onMessageReceived. Не выполняйте дополнительные асинхронные сетевые вызовы и не обрабатывайте полезную нагрузку в отдельном потоке в методе onMessageReceived. В противном случае приложение может выйти за рамки допустимого жизненного цикла процесса до того, как полезная нагрузка будет полностью обработана. В этом случае уведомления о некоторых сообщениях FCM могут приходить с задержкой или не приходить вообще.
Если вам нужно дополнительное время на обработку сообщения, например для получения imageUrl, содержащегося в полезной нагрузке сообщения, вам потребуется использовать конструкцию, такую как WorkManager, или активную службу, чтобы продлить жизненный цикл приложения. Чтобы убедиться, что уведомления обрабатываются полностью, при переопределении метода onMessageReceived следуйте приведенным ниже рекомендациям.
- Для уведомлений с высоким приоритетом. Запустите приоритетную задачу с помощью Android
WorkManager, чтобы убедиться, что уведомление с высоким приоритетом обрабатывается в первую очередь и отрисовывается полностью. Если вы беспокоитесь, что из-за обработки FCM с высоким приоритетом у вас закончатся квоты на приоритетные задачи, то не стоит. Исключение составляют приоритетные задачи, запланированные сразу после отправки сообщения FCMonMessageReceivedс высоким приоритетом. - Для уведомлений с обычным приоритетом запустите обычный
WorkRequest, используя AndroidWorkManager. Это позволит убедиться, что дополнительная работа, необходимая для обработки уведомления, будет выполнена без использования приоритетной обработки и не приведет к ненужному расходу заряда батареи.
Как задать приоритет для сообщений
Вы можете отправлять уведомления пользователям с помощью Admin SDK, FCM REST API и консоли Firebase. Чтобы изменить приоритет в Admin SDK и FCM REST API, нужно обновить полезную нагрузку JSON сообщения. Ниже приведен пример кода, в котором приоритет задан как высокий. Для уведомлений, отправленных из консоли, настройка полей уведомлений для Android не поддерживается.
{
"message": {
"notification": {
"body": "Purchase exceeding $500 detected",
"title": "Credit card purchase"
},
"data": {
"purchaser": "Your child",
"items": "Gravity Defier Sneakers"
},
"android": {
"priority": "high"
},
"apns": {
"headers": {
"apns-priority": "5"
}
}
}
}
Как протестировать уведомления с высоким приоритетом в спящем режиме
Чтобы убедиться, что ваши уведомления с высоким приоритетом правильно принимаются и обрабатываются пользователями, следуйте этим инструкциям по тестированию уведомлений:
- Переведите устройство в спящий режим, следуя инструкциям в статье Тестирование приложения в спящем режиме.
- Получите доступ к токену регистрации FCM из приложения на тестовом устройстве. Подробнее о том, как получить доступ к токену, рассказывается в статье Как отправить тестовое сообщение в фоновое приложение.
- Получив токен FCM, отправьте уведомление с высоким приоритетом на тестовое устройство, используя код отправки уведомлений FCM или команду cURL с параметрами конфигурации, соответствующими уведомлению с высоким приоритетом.
Понижение приоритета FCM на Android
Высокий приоритет на устройствах Android присваивается сообщениям, которые содержат срочную информацию и должны быть показаны пользователю в виде уведомлений. Если FCM обнаружит, что сообщения не приводят к показу пользовательских уведомлений, то вашим сообщениям может быть присвоен обычный приоритет или они могут быть делегированы сервисам Google Play.
При определении того, следует ли понизить приоритет сообщений или использовать прокси-сервер, FCM использует данные о поведении сообщений за 7 дней. Это решение принимается независимо для каждого экземпляра вашего приложения. Если в ответ на сообщения с высоким приоритетом уведомления показываются так, что пользователь их видит, то это не повлияет на будущие сообщения с высоким приоритетом.
Делегирование уведомлений с помощью сервисов Google Play
Уведомления с высоким приоритетом, которые соответствуют определенным критериям, передаются через сервисы Google Play, а не понижаются в приоритете. Это означает, что уведомления показываются сервисами Google Play от имени приложения, без необходимости запускать его. Это сделано для того, чтобы обеспечить лучший пользовательский опыт на устройствах Android.
Обратите внимание, что прокси-уведомления влияют на то, как в отчетах отражается статистика по полученным сообщениям:
- Чтобы получать статистику по прокси-уведомлениям, в вашем приложении должна использоваться FCM SDK версии 24.0.0 или выше.
- Вы можете заметить задержки или снижение количества полученных сообщений по сравнению с количеством до введения прокси-уведомлений. Это связано с тем, что аналитика для проксированных уведомлений регистрируется только после запуска приложения и может вообще не регистрироваться, если уведомление не приводит к открытию приложения.
Такой способ передачи уведомлений используется по умолчанию в приложениях для Android Q и более поздних версий, а также в сервисах Google Play версии 19054000 и более поздних. Сообщения, отправленные через HTTP v1 API, передаются через прокси-сервер, а отправленные через консоль Firebase или устаревшие API – нет. Обратите внимание, что эта функция находится на стадии бета-тестирования и может быть изменена.
Мы настоятельно рекомендуем оставить делегирование включенным, чтобы экономить заряд батареи и память устройства. Однако вы можете отключить его одним из следующих способов:
- На уровне приложения: добавьте в манифест приложения директиву
<meta-data android:name= "delivery_metrics_exported_to_big_query_enabled" android:value="false"/>. - Для экземпляра приложения. Задайте
fun setNotificationDelegationEnabled(disable: Boolean): Task<Void!>в интерфейсе приложения в зависимости от конкретного сценария использования. - Для отдельных сообщений: задайте для ключа
proxyзначениеDENYв объектеAndroidNotificationдля запроса на отправку.
Как измерить снижение приоритета сообщений на Android
Отдельные сообщения. При доставке вы можете определить, был ли понижен приоритет отдельного сообщения, сравнив его приоритет доставки, полученный из getPriority(), с его исходным приоритетом, полученным из getOriginalPriority().
Все сообщения. FCM Aggregate Delivery Data API может сообщать, какой процент всех ваших сообщений на Android имеет пониженный приоритет. Некоторые сообщения могут быть исключены из агрегированных отчетов, но в целом эти отчеты должны давать общее представление о частоте снижения приоритета сообщений. Дополнительную информацию и образец кода для запроса к API можно найти в статье Агрегированные данные о показе. Также вы можете воспользоваться API Explorer.
Прокси-уведомления. Уведомления, отправленные через прокси-сервер, не будут учитываться в текущих показателях доставки FCM или GA, поэтому вы можете заметить снижение показателей доставки уведомлений на 15 %. Чтобы получать отчеты о проксированных сообщениях, используйте Aggregate Delivery Data APIFCM.
ProxyNotificationInsightPercentsсообщает процент успешно перенаправленных уведомлений, а также сведения о сообщениях, которые не удалось перенаправить.
Устранение неполадок с задержкой уведомлений
Убедитесь, что в вашем экземпляре приложения включены уведомления. Если пользователь отключил разрешение на уведомления для вашего приложения, ни одно из ваших уведомлений не будет опубликовано, в результате чего приоритет ваших сообщений будет снижен. Прежде чем отправлять сообщения с высоким приоритетом в экземпляр приложения, убедитесь, что уведомления включены.
Избегайте дополнительных сетевых вызовов при обработке уведомления. Поскольку небольшая часть мобильных устройств Android находится в сетях с высокой задержкой, не открывайте подключение к своим серверам перед показом уведомления. Обратный вызов сервера до окончания допустимого времени обработки может быть рискованным для пользователей в сетях с высокой задержкой.
Вместо этого включите контент уведомления в сообщение FCM и сразу же покажите его. Если вам нужно синхронизировать дополнительный контент в приложении на Android, вы можете запланировать задачу с помощью WorkManager, чтобы она выполнялась в фоновом режиме.