Локално обавештење је порука коју апликација шаље кориснику без учешћа удаљеног сервера. Сви подаци се обрађују и приказују директно на уређају примаоца. Такав механизам је погодан за подсетнике, тајмере и будилнике, када је апликација у позадини или затворена. Према 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође