Локальні сповіщення в мобільній розробці: суть, які бувають та як працюють

Автор: IT Sectr Опубліковано: 2026-03-19 Час читання: 8 хв

Локальне сповіщення — це повідомлення, яке додаток надсилає користувачеві без участі віддаленого сервера. Всі дані обробляються та відображаються безпосередньо на пристрої отримувача. Такий механізм підходить для нагадувань, таймерів і будильників, коли додаток знаходиться у фоні або закритий. За даними Apple Developer Documentation, UNUserNotificationCenter забезпечує централізоване управління локальними сповіщеннями на iOS.

Головне

  • Локальне сповіщення — повідомлення, яке планується та доставляється пристроєм без участі сервера
  • Платформи — Android використовує NotificationManager, iOS використовує UNUserNotificationCenter
  • Планування — сповіщення можуть відкладатися за часом, геопозицією або календарем
  • Обмеження — локальні сповіщення не працюють між пристроями та вимагають окремої логіки синхронізації
  • UX — правильно налаштовані сповіщення підвищують залученість і повертають користувача в додаток

Що таке локальне сповіщення?

Локальне сповіщення — це тригерне повідомлення, яке генерується та відображається операційною системою на тому ж пристрої, де встановлено додаток. На відміну від push-сповіщень, локальні не проходять через зовнішній сервер — вся логіка планування виконується на клієнті.

Такі сповіщення працюють незалежно від стану додатка: активний він, згорнутий чи повністю закритий. Операційна система бере на себе доставку в призначений час, а розробник задає тільки вміст та тригер.

Система гарантує доставку локального сповіщення навіть за відсутності мережі. Це ключова перевага перед push-сповіщеннями, які вимагають стабільного інтернет-з'єднання та працюючого сервера.

Основні компоненти запиту

Кожне локальне сповіщення складається з трьох частин: вміст (заголовок, тіло, звук), тригер (часова або гео-умова) та ідентифікатор запиту. Ідентифікатор дозволяє скасувати або оновити сповіщення до його доставки.

Розробник може задати до 64 локальних сповіщень на один додаток у iOS та необмежену кількість в Android. Різниця пов'язана з архітектурними обмеженнями операційних систем.

Як працюють локальні сповіщення на 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

Для планування локального сповіщення на Android використовуйте NotificationManager у парі з AlarmManager. З Android 8+ необхідно спочатку створити канал сповіщень, інакше сповіщення не відобразиться.

kotlin
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, який гарантує доставку в межах часового вікна.

Обробка в BroadcastReceiver

При спрацьовуванні AlarmManager система надсилає широкомовний Intent, який приймає BroadcastReceiver. Всередині нього необхідно створити та показати сповіщення через NotificationManager. Переконайтеся, що PendingIntent використовує FLAG_UPDATE_CURRENT, інакше при зміні даних старі сповіщення продовжуватимуть використовувати застарілий Intent.

Приклад планування на iOS

На iOS локальні сповіщення створюються через UNUserNotificationCenter за допомогою UNMutableNotificationContent та одного з тригерів. Перед плануванням необхідно запитати дозвіл у користувача.

swift
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?

Локальне сповіщення планується та доставляється пристроєм без участі сервера. 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. Кожна кнопка запускає окрему дію в додатку.

Підсумки

  • Локальні сповіщення — повідомлення, які плануються та доставляються пристроєм без серверної інфраструктури
  • UNUserNotificationCenter — основний API для роботи з локальними сповіщеннями на iOS
  • NotificationManager — основний API для роботи з локальними сповіщеннями на Android
  • Типи тригерів — часовий інтервал, календарна дата, геопозиція та безумовна доставка
  • Ліміти — iOS обмежує до 64 запланованих запитів, Android не має строгого обмеження
  • Дозволи — на iOS та Android 13+ потрібна явна згода користувача на показ сповіщень
  • Офлайн — локальні сповіщення працюють без інтернет-з'єднання, що робить їх надійнішими за push

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також