Локальне сповіщення — це повідомлення, яке додаток надсилає користувачеві без участі віддаленого сервера. Всі дані обробляються та відображаються безпосередньо на пристрої отримувача. Такий механізм підходить для нагадувань, таймерів і будильників, коли додаток знаходиться у фоні або закритий. За даними Apple Developer Documentation, UNUserNotificationCenter забезпечує централізоване управління локальними сповіщеннями на iOS.
Головне
Локальне сповіщення — це тригерне повідомлення, яке генерується та відображається операційною системою на тому ж пристрої, де встановлено додаток. На відміну від push-сповіщень, локальні не проходять через зовнішній сервер — вся логіка планування виконується на клієнті.
Такі сповіщення працюють незалежно від стану додатка: активний він, згорнутий чи повністю закритий. Операційна система бере на себе доставку в призначений час, а розробник задає тільки вміст та тригер.
Система гарантує доставку локального сповіщення навіть за відсутності мережі. Це ключова перевага перед push-сповіщеннями, які вимагають стабільного інтернет-з'єднання та працюючого сервера.
Кожне локальне сповіщення складається з трьох частин: вміст (заголовок, тіло, звук), тригер (часова або гео-умова) та ідентифікатор запиту. Ідентифікатор дозволяє скасувати або оновити сповіщення до його доставки.
Розробник може задати до 64 локальних сповіщень на один додаток у iOS та необмежену кількість в Android. Різниця пов'язана з архітектурними обмеженнями операційних систем.
Обидві платформи надають власні API для роботи з локальними сповіщеннями. На iOS центральний елемент — UNUserNotificationCenter, на Android — NotificationManager. Незважаючи на різні інтерфейси, логіка збігається: додаток створює запит, реєструє його в системі, і ОС доставляє сповіщення в заданий момент.
iOS використовує UNCalendarNotificationTrigger для календарних подій, UNTimeIntervalNotificationTrigger для інтервалів та UNLocationNotificationTrigger для геопозиції. Android пропонує AlarmManager, WorkManager та точне планування через setExact.
З версії Android 12 — SCHEDULE_EXACT_ALARM вимагає спеціального дозволу від користувача. На iOS дозвіл запитується один раз через UNUserNotificationCenter.requestAuthorization, і користувач обирає рівень доступу: банери, звуки, значки.
Локальні сповіщення класифікуються за типом тригера, а не за вмістом. Кожен тип визначає, коли та за яких умов сповіщення буде показано користувачеві.
На iOS та Android типи тригерів реалізовано по-різному, хоча логічна класифікація збігається. iOS використовує UNCalendarNotificationTrigger для дат, UNTimeIntervalNotificationTrigger для інтервалів та UNLocationNotificationTrigger для геопозиції. Android пропонує AlarmManager з setExact та setRepeating, а також WorkManager для відкладених завдань.
| Тип тригера | Опис | Приклад |
|---|---|---|
| Часовий інтервал | Сповіщення через N секунд після запуску | Таймер зворотного відліку |
| Календарна дата | Сповіщення в конкретний час та дату | Нагадування про зустріч |
| Геопозиція | Сповіщення при вході/виході з регіону | Нагадування біля магазину |
| Безумовне | Негайна доставка при виклику API | Сповіщення про завантаження |
На iOS також доступний UNNotificationAttachment — вкладення зображення, аудіо або відео в тіло сповіщення. Android підтримує кастомні шаблони з кнопками та великими зображеннями через NotificationCompat.Style.
Вибір тригера залежить від сценарію: календарні нагадування найкраще працюють через календарний тригер, а гео-нагадування — через геопозицію. Інтервальні тригери підходять для регулярних подій з фіксованим періодом.
На iOS локальні сповіщення доставляються системою навіть при закритому додатку — UNUserNotificationCenter керує чергою самостійно. На Android доставка залежить від обраного механізму: AlarmManager спрацьовує навіть при вимкненому екрані, а WorkManager — з урахуванням енергозбереження.
Локальні сповіщення вирішують завдання, де зовнішня інфраструктура надмірна або недоступна. Основні сценарії: нагадування, таймери, навчальні підказки та відкладені дії.
Дослідження Localytics показують, що додатки, які використовують локальні нагадування, утримують на 35% більше користувачів у перший тиждень після встановлення. Це робить локальні сповіщення потужним інструментом онбордингу.
Важливо не зловживати частотою — система сама групує сповіщення від одного додатка, а користувач може вимкнути всі локальні сповіщення, якщо вони набридають. Оптимальна частота — не більше 2–3 сповіщень на день для не-критичних подій.
Для планування локального сповіщення на Android використовуйте NotificationManager у парі з AlarmManager. З Android 8+ необхідно спочатку створити канал сповіщень, інакше сповіщення не відобразиться.
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"
val channel = NotificationChannel(
channelId,
"Нагадування",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Канал для нагадувань про завдання"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
val intent = Intent(this, ReminderReceiver::class.java).apply {
putExtra("notification_id", notificationId)
putExtra("channel_id", channelId)
}
val pendingIntent = PendingIntent.getBroadcast(
this, notificationId.hashCode(),
intent, PendingIntent.FLAG_UPDATE_CURRENT
)
val alarmManager = getSystemService(AlarmManager::class.java)
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerTimeMillis,
pendingIntent
)
На Android 12+ перевірте дозвіл SCHEDULE_EXACT_ALARM перед викликом setExact. Якщо дозвіл не надано — використовуйте setWindow, який гарантує доставку в межах часового вікна.
При спрацьовуванні AlarmManager система надсилає широкомовний Intent, який приймає BroadcastReceiver. Всередині нього необхідно створити та показати сповіщення через NotificationManager. Переконайтеся, що PendingIntent використовує FLAG_UPDATE_CURRENT, інакше при зміні даних старі сповіщення продовжуватимуть використовувати застарілий Intent.
На iOS локальні сповіщення створюються через UNUserNotificationCenter за допомогою UNMutableNotificationContent та одного з тригерів. Перед плануванням необхідно запитати дозвіл у користувача.
import UserNotifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
guard granted else { return }
}
let content = UNMutableNotificationContent()
content.title = "Нагадування про завдання"
content.body = "Не забудьте завершити звіт до 18:00"
content.sound = .default
content.userInfo = ["task_id": "42"]
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 3600,
repeats: false
)
let request = UNNotificationRequest(
identifier: "task_reminder_42",
content: content,
trigger: trigger
)
center.add(request)
iOS підтримує до 64 одночасних запитів на локальні сповіщення. Якщо ліміт перевищено — система відхиляє нові запити доти, доки активні не будуть доставлені або скасовані. Використовуйте getPendingNotificationRequests для перевірки поточної черги.
Коли користувач взаємодіє з локальним сповіщенням iOS, викликається метод userNotificationCenter:didReceive response делегата UNUserNotificationCenterDelegate. У цьому методі доступні ідентифікатор запиту, actionIdentifier (яка кнопка натиснута) та кастомні userInfo. Це дозволяє розрізняти просте відкриття сповіщення та натискання на конкретну кнопку дії.
Щоб локальні сповіщення приносили користь, а не дратували користувача, дотримуйтеся кількох ключових правил. Перше: контролюйте частоту — не більше 2–3 сповіщень на день для не-критичних подій, інакше користувач вимкне всі сповіщення додатка.
Друге: давайте користувачеві вибір. Додайте в інтерфейс можливість вимкнути певні типи локальних сповіщень. На Android для цього зручно використовувати окремий NotificationChannel з низьким importance, на iOS — окрему категорію в налаштуваннях додатка.
Третє: контекстна релевантність — сповіщення має з'являтися, коли воно необхідне користувачеві. Гео-тригери ідеальні для нагадувань про справи поруч з домом, календарні — для зустрічей, інтервальні — для регулярних дій на кшталт пиття води або розминки. Не змішуйте типи без необхідності.
Четверте: тестуйте на реальних пристроях. Симулятор iOS не емулює всі сценарії доставки локальних сповіщень, особливо у фоні. На Android використовуйте adb shell dumpsys notification для перевірки черги запланованих сповіщень та їхніх параметрів. П'яте: завжди надавайте користувачеві можливість вимкнути сповіщення через інтерфейс додатка — це обов'язкова вимога UX та App Store Review Guidelines.
Часті запитання
Локальне сповіщення планується та доставляється пристроєм без участі сервера. Push-сповіщення вимагає зовнішнього сервісу (FCM, APNS) та інтернет-з'єднання. Локальні працюють офлайн, push — тільки за наявності мережі.
iOS обмежує до 64 одночасно запланованих запитів. Android не має строгого ліміту, але понад 500 сповіщень може знизити продуктивність системи та вплинути на час доставки.
Так, на iOS використовуйте removePendingNotificationRequests з ідентифікатором запиту. На Android викличте NotificationManager.cancel або скасуйте PendingIntent через AlarmManager. Унікальний ідентифікатор обов'язковий для скасування.
На iOS дозвіл запитується обов'язково через requestAuthorization. На Android 13+ (Tiramisu) також потрібен дозвіл POST_NOTIFICATIONS. Старіші версії Android не вимагають явного дозволу для локальних сповіщень.
На iOS створіть UNNotificationAction та додайте в UNNotificationCategory. На Android використовуйте NotificationCompat.Builder.addAction з PendingIntent на BroadcastReceiver. Кожна кнопка запускає окрему дію в додатку.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також