Для сообщений, отправляемых на устройства Android, можно задать два уровня приоритета доставки: обычный и высокий. Доставка писем с обычным и высоким приоритетом работает следующим образом:
Обычный приоритет. Это приоритет по умолчанию для сообщений с данными и уведомлений. Письма с обычным приоритетом доставляются сразу, если устройство не находится в спящем режиме. Когда устройство находится в спящем режиме, доставка может быть задержана, чтобы сэкономить заряд батареи до выхода устройства из спящего режима. Для менее срочных сообщений, например уведомлений о новых письмах, синхронизации интерфейса или фоновой синхронизации данных приложений, выберите обычный приоритет доставки.
Высокий приоритет.FCM пытается доставить сообщения с высоким приоритетом немедленно, позволяя FCM при необходимости вывести устройство из спящего режима и выполнить ограниченную обработку (включая очень ограниченный доступ к сети). Сообщения с высоким приоритетом обычно должны приводить к взаимодействию пользователя с приложением или его уведомлениями.
Как определить, какое письмо имеет высокий приоритет
Письма с обычным приоритетом подходят для общих новостей, а с высоким – для срочных вопросов и действий, требующих немедленного выполнения. Поскольку режим Doze может влиять на время доставки сообщений с обычным приоритетом, установите высокий приоритет для большинства уведомлений, которые видят пользователи. Это позволит обеспечить своевременную доставку. Например, уведомления о сообщениях в чате, проблемах с аккаунтом или доставке еды должны иметь высокий приоритет.
Обработка сообщений с высоким и обычным приоритетом
Для обработки полезной нагрузки сообщений с высоким и обычным приоритетом, полученных на устройстве Android, в обработчике onMessageReceived отводится несколько секунд. При этом для сообщений с высоким приоритетом выделяется немного больше времени, чем для сообщений с обычным. Это время должно быть достаточно долгим, чтобы сразу же отобразить уведомление. Если вам нужно выполнить дополнительные действия, например загрузить изображение из хранилища устройства или вызвать серверы для сбора дополнительного контента, вам потребуется выполнить дополнительные шаги.
Метод onMessageReceived вызывается в отдельном рабочем потоке. Рекомендуем обрабатывать полезную нагрузку сообщения и показывать уведомление сразу в методе onMessageReceived. В методе onMessageReceived не следует выполнять дополнительные асинхронные сетевые вызовы или обрабатывать полезную нагрузку в отдельном потоке. Это может привести к тому, что приложение выйдет за пределы действительного жизненного цикла процесса до того, как полезная нагрузка будет полностью обработана. В этом случае некоторые сообщения FCM могут приводить к задержкам или отсутствию уведомлений.
Если вам нужно дополнительное время на обработку сообщения, например на получение imageUrl, содержащегося в полезной нагрузке сообщения, вам потребуется использовать такие конструкции, как WorkManager или активная служба, чтобы продлить жизненный цикл приложения. При переопределении метода onMessageReceived следуйте приведенным ниже рекомендациям, чтобы убедиться, что уведомления обрабатываются полностью.
- Для уведомлений с высоким приоритетом: запустите ускоренное задание с помощью Android
WorkManager, чтобы убедиться, что уведомление с высоким приоритетом обрабатывается в первую очередь и его отрисовка завершается. Если вы беспокоитесь о том, что из-за обработки FCM с высоким приоритетом будут исчерпаны квоты на ускоренные задачи, то можете не волноваться. Для срочных заданий, запланированных сразу после отправки FCM-уведомленияonMessageReceivedс высоким приоритетом, предусмотрено небольшое исключение. - Для уведомлений с обычным приоритетом используйте обычный метод
WorkRequestс помощью AndroidWorkManager. Это позволит убедиться, что дополнительная работа, необходимая для обработки вашего уведомления, будет выполнена в конечном итоге без использования приоритетной обработки и ненужного расхода заряда батареи.
Как задать приоритет для сообщений
Вы можете отправлять уведомления пользователям с помощью Admin SDK, REST API FCM и консоли 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, чтобы она выполнялась в фоновом режиме.