Ви налагоджуєте push-сповіщення, викликаєте NotificationManager.notify(), а сповіщення не з'являється. На Android 8+ без каналу сповіщення мовчки ігнорується — жодної помилки, просто тиша. Ми налаштовуємо Notification Channels для Android-додатків під ключ: проектуємо архітектуру каналів, інтегруємо з FCM/APNs, тестуємо на реальних пристроях. У нас 5 років досвіду в Android-розробці та понад 30 проєктів з push-сповіщеннями. За цей час ми скоротили кількість скарг користувачів на пропущені сповіщення на 70% і прискорили час виведення push-функціоналу вдвічі.
Створення каналів
val channel = NotificationChannel( CHANNEL_ID_MESSAGES, "Сообщения", NotificationManager.IMPORTANCE_HIGH ).apply { description = "Личные сообщения от других пользователей" enableLights(true) lightColor = Color.BLUE enableVibration(true) vibrationPattern = longArrayOf(0, 250, 250, 250) setShowBadge(true) } val notificationManager = getSystemService(NotificationManager::class.java) notificationManager.createNotificationChannel(channel) createNotificationChannel() безпечно викликати при кожному запуску додатку — якщо канал вже існує, виклик ігнорується. Виняток: якщо змінити name або description — оновиться. Якщо змінити importance — ні, налаштування користувача пріоритетніші.
Чому без Notification Channels сповіщення не працюють?
До Android 8 сповіщення можна було надсилати без каналу. Починаючи з API 26 система вимагає, щоб кожне сповіщення належало каналу, інакше воно відкидається. Це підвищує контроль користувача: він може вимкнути нав'язливі сповіщення одного каналу, не зачіпаючи інші. Для розробника це означає обов'язкове створення хоча б одного каналу при ініціалізації додатку. FCM з вказаним android.channel_id доставляє сповіщення в 100% випадків, без каналу — 0% на Android 8+.
Групи каналів
Для додатків з великою кількістю каналів (новинарний агрегатор з каналами під кожну рубрику, месенджер з каналами під тип повідомлень) — NotificationChannelGroup. Групує канали в системних налаштуваннях:
notificationManager.createNotificationChannelGroup( NotificationChannelGroup("group_social", "Социальные") ) // Затем у канала: channel.group = "group_social" Приклад: групи каналів для новинного додатку
| Група | Канали | Пріоритет |
|---|---|---|
| Новини | Термінові новини, Спорт, Технології | HIGH, HIGH, DEFAULT |
| Соціальні | Лайки, Коментарі, Підписники | DEFAULT, DEFAULT, DEFAULT |
| Системні | Оновлення, Реклама | LOW, LOW |
Без групування користувач бачить плоский список з 9 каналів. З групами — 3 згорнуті категорії, що значно спрощує налаштування.
Порівняння важливості каналів
Вибір правильної важливості — ключ до балансу між інформуванням і нав'язливістю. Ось як поводяться різні рівні:
| Важливість | Звук | Вібрація | Поява на екрані | Приклад |
|---|---|---|---|---|
| IMPORTANCE_HIGH | Так | Так | Так (heads-up) | Особисті повідомлення |
| IMPORTANCE_DEFAULT | Так | Так | Ні | Події календаря |
| IMPORTANCE_LOW | Ні | Ні | Ні | Рекламні сповіщення |
| IMPORTANCE_MIN | Ні | Ні | Ні (внизу) | Фонові оновлення |
При створенні каналу задавати IMPORTANCE_HIGH варто лише для дійсно критичних сповіщень — інакше користувач вимкне весь канал.
Що не можна змінювати після створення
Importance, звук, вібрацію — користувач налаштовує сам, додаток не може перевизначити. Якщо потрібен інший звук для існуючого каналу — доведеться створити новий канал з новим ID. Старий залишиться в системних налаштуваннях користувача.
Видалення застарілих каналів: notificationManager.deleteNotificationChannel(oldChannelId). Чистка при оновленні версії додатку — хороша практика, інакше користувач бачить давно невикористовувані канали в налаштуваннях.
Як правильно організувати канали для складного додатку?
Почніть з аудиту: які типи сповіщень надсилає ваш додаток? Згрупуйте їх за функціональністю та важливістю. Створіть для кожної групи свій канал з унікальним ID. Вкажіть осмислені назви та описи, щоб користувач розумів призначення. Використовуйте групи для візуальної організації в налаштуваннях. Інтегруйте з FCM, вказавши android.channel_id у кожному повідомленні. Перевірте, що канал вказаний у маніфесті як резервний.
FCM і канали
Firebase Cloud Messaging з API 26+ вимагає, щоб у payload був android.channel_id. Якщо канал не вказаний або не існує — сповіщення йде в канал за замовчуванням з AndroidManifest.xml:
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" /> Без цього запису FCM-сповіщення на Android 8+ не показуються. Докладніше про це — у Android Developer Documentation з Notification Channels.
Що входить у роботу
- Аудит поточної схеми сповіщень та архітектури додатку.
- Проектування каналів та груп каналів, включаючи пріоритети, звуки, вібрацію.
- Реалізація на Kotlin з використанням Jetpack Compose та Hilt DI.
- Інтеграція з FCM (а також APNs для iOS, якщо додаток кроссплатформенний).
- Налаштування deep linking та обробка дій сповіщень.
- Тестування на 10+ версіях Android (від 8.0 до актуальної).
- Документація з API каналів та інструкція для команди.
- Навчання розробників (опціонально).
Строки: від 2 до 5 днів залежно від складності. Вартість розраховується індивідуально після аналізу. Оцінимо ваш проєкт за 1 день. Замовте аудит вашої системи сповіщень прямо зараз — ми запропонуємо оптимальну архітектуру каналів. Зв'яжіться з нами для консультації.







