Локалното известие е съобщение, което приложението изпраща на потребителя без участието на отдалечен сървър. Всички данни се обработват и показват директно на устройството на получателя. Такъв механизъм е подходящ за напомняния, таймери и будилници, когато приложението е на заден фон или затворено. Според 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% повече потребители през първата седмица след инсталиране. Това прави локалните известия мощен инструмент за onboarding.
Важно е да не се злоупотребява с честотата — системата сама групира известията от едно приложение, а потребителят може да изключи всички локални известия, ако досаждат. Оптималната честота е не повече от 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 системата изпраща broadcast 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.
Често задавани въпроси
Локалното известие се планира и доставя от устройството без участие на сървър. 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също