🔔 Как не убить push-уведомления в Doze: гайд по FCM
🤖 Android любит экономить батарейку — есть всякие Doze и прочие оптимизации (про режим Doze в следующий раз) из-за чего приложения на андроид устройствам могут "засыпать". "Настоящие" же пуш-уведомления обычно должны отрабатываться системой в оперативное время, т.к. сильно связаны с системой. Но есть нюанс: если криво настроен Firebase Cloud Messaging, ваши пуши могут приходить с задержкой или не приходить вообще, что может сказаться на рейтинге вашего приложения.
Чтобы уведомления не терялись и реально доходили до юзера, важно:
1) Корректно выставлять приоритет уведомлений.
2) Грамотно обрабатывать полезную нагрузку (payload).
📌 Приоритеты FCM
У FCM есть два приоритета:
- normal — пуши приходят, когда экран включён. Если экран погас — ждут, пока устройство «проснётся» из Doze.
- high — пуши приходят сразу, даже если экран выключен. FCM может «разбудить» устройство.
Используй high priority, если уведомление действительно срочное и юзер должен его видеть (чаты, важные нотификации, доставка и т.д.).
Используй high priority, если уведомление действительно срочное и юзер должен его видеть (чаты, важные нотификации, доставка и т.д.).
⚠️ Но тут стоит быть аккуратным - Google может Google может ограничить (throttle) high-приоритетные пуши, если они не приводят к видимому уведомлению или открытию приложения. Поэтому - используй high priority только если точно будет UI-реакция (показ уведомления, открытие экрана и т.д.).
🚀 Как отправлять пуши с нужным приоритетом?
1) Через Firebase Admin SDK
2) Через FCM REST API
3) Из Firebase Console — но там нельзя указать android.priority, так что только для простых кейсов.
🧠 Обработка onMessageReceived
Метод onMessageReceived() вызывается в фоновом потоке. Android даёт несколько секунд, чтобы обработать payload. Для high priority — чуть больше времени, но всё равно мало. Поэтому, не надо тянуть туда async-логики, запросов к серверу и прочих тяжёлых операций.
Если всё-таки нужно потянуть данные (например, картинку по imageUrl), используй:
- WorkManager (expedited) — для high priority
- Обычный WorkRequest — для normal priority
Это даст твоему коду больше времени, и он не упадет из-за таймаутов жизненного цикла.
🧪 Проверка high priority пушей в режиме Doze
🧪 Проверка high priority пушей в режиме Doze
1) Введи тестовое устройство в Doze. [инструкция]
2) Получи FCM токен. [инструкция]
3) Отправь пуш с приоритетом high через Admin SDK или cURL.
4) Проверь, что всё дошло чётко и быстро.
💡 Какие можно сделать выводы?
1) Используй priority: "high" для всего, что юзер должен увидеть сразу
2) Оперативно обрабатывай payload внутри onMessageReceived()
3) Используй WorkManager для тяжёлыйх/долгих операций
4) Не увлекайся high priority — Firebase тебя замьютит
5) Тестируй пуши в Doze, а не только на активном экране
firebase
android
push
notification
google
doze
fcm
payload
mobile
developer