Для сообщений, отправляемых на устройства Android, можно задать два уровня приоритета доставки: обычный и высокий. Доставка писем с обычным и высоким приоритетом работает следующим образом:
Обычный приоритет. Это приоритет по умолчанию для сообщений с данными и уведомлений. Сообщения с обычным приоритетом доставляются немедленно, если устройство не находится в спящем режиме. Если устройство находится в спящем режиме, доставка может быть отложена для экономии заряда батареи. Для менее срочных сообщений, таких как уведомления о новых письмах, синхронизация интерфейса или синхронизация данных приложения в фоновом режиме, выбирайте обычный приоритет выполнения.
Высокий приоритет.FCM пытается доставить сообщения с высоким приоритетом немедленно, позволяя FCM при необходимости выводить устройство из спящего режима и выполнять ограниченную обработку (включая очень ограниченный доступ к сети). Сообщения с высоким приоритетом обычно требуют взаимодействия пользователя с приложением или его уведомлениями.
Как определить, какое письмо имеет высокий приоритет
Сообщения с обычным приоритетом подходят для общих обновлений, а с высоким – для срочных вопросов или действий, требующих немедленной доставки. Поскольку режим Doze может влиять на время доставки сообщений с обычным приоритетом, установите высокий приоритет для большинства уведомлений, которые видят пользователи. Это позволит обеспечить своевременную доставку. Например, уведомления о сообщениях в чате, проблемах с аккаунтом или доставке еды должны иметь высокий приоритет.
Обработка сообщений с высоким и обычным приоритетом
Для обработки полезной нагрузки сообщений с высоким и обычным приоритетом, полученных на устройстве 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 использует данные о поведении сообщений за семь дней, чтобы определить, нужно ли понизить приоритет сообщения или передать его через прокси-сервер. Это решение принимается независимо для каждого экземпляра вашего приложения. Если в ответ на сообщения с высоким приоритетом уведомления показываются так, что пользователь их видит, то это не повлияет на будущие сообщения с высоким приоритетом.
Делегирование уведомлений с помощью сервисов 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 %. Для создания отчетов о сообщениях, отправленных через прокси-сервер, используйте FCM Aggregate Delivery Data API.
ProxyNotificationInsightPercentsсообщает процент успешно перенаправленных уведомлений, а также сведения о сообщениях, которые не удалось перенаправить.
Устранение неполадок с задержкой уведомлений
Убедитесь, что в приложении включены уведомления. Если пользователь отключил разрешение на уведомления для вашего приложения, ни одно из ваших уведомлений не будет опубликовано, в результате чего приоритет ваших сообщений будет снижен. Прежде чем отправлять приоритетные сообщения в экземпляр приложения, убедитесь, что уведомления включены.
Избегайте дополнительных сетевых вызовов при обработке уведомления. Поскольку небольшая часть мобильных устройств Android находится в сетях с высокой задержкой, не открывайте подключение к своим серверам перед показом уведомления. Обратный вызов сервера до окончания допустимого времени обработки может быть рискованным для пользователей в сетях с высокой задержкой.
Вместо этого добавьте контент уведомления в сообщение FCM и покажите его сразу. Если вам нужно синхронизировать дополнительный контент в приложении на устройстве Android, вы можете запланировать задачу с помощью WorkManager, чтобы она выполнялась в фоновом режиме.