Для чего нужны каналы в Firebase Push Notifications
Что проверяют
Знаете ли вы, что каналы это механизм Android, а не Firebase, и как FCM с ними взаимодействует. Следом обычно спрашивают, что будет с уведомлением, если канал не создан, и можно ли поменять важность канала после релиза.
Как отвечать
Начните с разграничения. FCM только доставляет сообщение, а каналы (NotificationChannel) появились в Android 8.0, API 26. С этой версии уведомление без канала система не покажет.
Что даёт канал:
- категории: «Сообщения», «Акции», «Статус заказа». Пользователь видит их в настройках приложения и может отключить рекламу, оставив важное;
- поведение: важность задаёт звук и всплывающий баннер.
IMPORTANCE_HIGHпоказывает heads-up,IMPORTANCE_LOWприходит без звука; - контроль у пользователя: после создания канала важность, звук и вибрацию меняет только пользователь. Код может обновить название и описание, но не поднять важность.
Теперь связь с FCM. Канал создают при старте приложения через NotificationManager.createNotificationChannel() или NotificationManagerCompat, повторный вызов с тем же id безопасен. В сообщении с сервера указывают android.notification.channel_id. Если приложение в фоне и пришло notification-сообщение, его покажет сам SDK в указанном канале. Когда такого канала нет, берётся канал по умолчанию из манифеста (com.google.firebase.messaging.default_notification_channel_id), а без него SDK создаёт запасной канал с общим названием. Data-сообщения всегда приходят в onMessageReceived(), и канал в NotificationCompat.Builder вы указываете сами.
Добавьте про Android 13: для показа уведомлений нужно runtime-разрешение POST_NOTIFICATIONS, без него каналы не помогут.
Где спотыкаются
Путают каналы с топиками FCM. Топик решает, кому сервер отправит сообщение, канал решает, как телефон его покажет.
Пытаются сделать канал громче в новой версии, меняя importance в коде. Настройки существующего канала так не меняются, нужен новый id и удаление старого через deleteNotificationChannel().
Создают канал только внутри onMessageReceived(). Notification-сообщения в фоне туда не попадают, и уведомления уходят в запасной канал вместо нужной категории.