Notificarea locală este un mesaj pe care aplicația îl trimite utilizatorului fără participarea unui server la distanță. Toate datele sunt procesate și afișate direct pe dispozitivul destinatarului. Un astfel de mecanism este potrivit pentru memento-uri, timer-e și alarme, când aplicația este în fundal sau închisă. Conform Apple Developer Documentation, UNUserNotificationCenter asigură gestionarea centralizată a notificărilor locale pe iOS.
Principalele puncte
O notificare locală este un mesaj declanșat și afișat de sistemul de operare pe același dispozitiv pe care este instalată aplicația. Spre deosebire de notificările push, cele locale nu trec printr-un server extern — întreaga logică de planificare se execută pe client.
Astfel de notificări funcționează indiferent de starea aplicației: activă, minimizată sau complet închisă. Sistemul de operare preia livrarea la momentul stabilit, iar dezvoltatorul specifică doar conținutul și declanșatorul.
Sistemul garantează livrarea notificării locale chiar și în absența rețelei. Acesta este un avantaj cheie față de notificările push, care necesită o conexiune stabilă la internet și un server funcțional.
Fiecare notificare locală este formată din trei părți: conținut (titlu, corp, sunet), declanșator (condiție temporală sau geografică) și identificatorul cererii. Identificatorul permite anularea sau actualizarea notificării înainte de livrare.
Dezvoltatorul poate seta până la 64 de notificări locale pentru o aplicație pe iOS și un număr nelimitat pe Android. Diferența se datorează limitărilor arhitecturale ale sistemelor de operare.
Ambele platforme oferă propriile API-uri pentru lucrul cu notificările locale. Pe iOS elementul central este UNUserNotificationCenter, pe Android — NotificationManager. În ciuda interfețelor diferite, logica este aceeași: aplicația creează o cerere, o înregistrează în sistem, iar OS-ul livrează notificarea la momentul stabilit.
iOS folosește UNCalendarNotificationTrigger pentru evenimente calendaristice, UNTimeIntervalNotificationTrigger pentru intervale și UNLocationNotificationTrigger pentru geolocație. Android oferă AlarmManager, WorkManager și planificarea exactă prin setExact.
Începând cu Android 12 — SCHEDULE_EXACT_ALARM necesită o permisiune specială de la utilizator. Pe iOS permisiunea se solicită o singură dată prin UNUserNotificationCenter.requestAuthorization, iar utilizatorul alege nivelul de acces: bannere, sunete, ecusoane.
Notificările locale se clasifică după tipul declanșatorului, nu după conținut. Fiecare tip determină când și în ce condiții va fi afișată notificarea utilizatorului.
Pe iOS și Android tipurile de declanșatoare sunt implementate diferit, deși clasificarea logică este aceeași. iOS folosește UNCalendarNotificationTrigger pentru date, UNTimeIntervalNotificationTrigger pentru intervale și UNLocationNotificationTrigger pentru geolocație. Android oferă AlarmManager cu setExact și setRepeating, precum și WorkManager pentru sarcini întârziate.
| Tip declanșator | Descriere | Exemplu |
|---|---|---|
| Interval de timp | Notificare după N secunde de la pornire | Timer de numărătoare inversă |
| Dată calendaristică | Notificare la o oră și dată specifică | Memento de întâlnire |
| Geolocație | Notificare la intrarea/ieșirea dintr-o regiune | Memento lângă magazin |
| Necondiționat | Livrare imediată la apelul API | Notificare de descărcare |
Pe iOS este disponibil și UNNotificationAttachment — atașament de imagine, audio sau video în corpul notificării. Android suportă șabloane personalizate cu butoane și imagini mari prin NotificationCompat.Style.
Alegerea declanșatorului depinde de scenariu: memento-urile calendaristice funcționează cel mai bine prin declanșatorul calendaristic, iar geo-memento-urile — prin geolocație. Declanșatoarele pe interval sunt potrivite pentru evenimente regulate cu o perioadă fixă.
Pe iOS notificările locale sunt livrate de sistem chiar și când aplicația este închisă — UNUserNotificationCenter gestionează coada independent. Pe Android livrarea depinde de mecanismul ales: AlarmManager se activează chiar și cu ecranul oprit, iar WorkManager — ținând cont de economisirea energiei.
Notificările locale rezolvă sarcini în care infrastructura externă este redundantă sau indisponibilă. Principalele scenarii: memento-uri, timer-e, sfaturi educaționale și acțiuni amânate.
Cercetările Localytics arată că aplicațiile care folosesc memento-uri locale rețin cu 35% mai mulți utilizatori în prima săptămână după instalare. Acest lucru face notificările locale un instrument puternic de onboardig.
Este important să nu abuzați de frecvență — sistemul grupează singur notificările de la o aplicație, iar utilizatorul poate dezactiva toate notificările locale dacă devin deranjante. Frecvența optimă este de cel mult 2–3 notificări pe zi pentru evenimente non-critice.
Pentru planificarea unei notificări locale pe Android folosiți NotificationManager împreună cu AlarmManager. Începând cu Android 8+ trebuie creat mai întâi un canal de notificări, altfel notificarea nu va fi afișată.
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"
val channel = NotificationChannel(
channelId,
"Mementouri",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Canal pentru mementouri de sarcini"
}
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
)
Pe Android 12+ verificați permisiunea SCHEDULE_EXACT_ALARM înainte de a apela setExact. Dacă permisiunea nu a fost acordată — folosiți setWindow, care garantează livrarea într-o fereastră de timp.
La activarea AlarmManager, sistemul trimite un Intent de difuzare care este recepționat de BroadcastReceiver. În interiorul acestuia trebuie creată și afișată notificarea prin NotificationManager. Asigurați-vă că PendingIntent folosește FLAG_UPDATE_CURRENT, altfel la modificarea datelor notificările vechi vor continua să folosească Intent-ul învechit.
Pe iOS notificările locale se creează prin UNUserNotificationCenter folosind UNMutableNotificationContent și unul dintre declanșatoare. Înainte de planificare trebuie solicitată permisiunea utilizatorului.
import UserNotifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
guard granted else { return }
}
let content = UNMutableNotificationContent()
content.title = "Memento de sarcină"
content.body = "Nu uitați să finalizați raportul până la 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 suportă până la 64 de cereri simultane de notificări locale. Dacă limita este depășită — sistemul respinge cererile noi până când cele active sunt livrate sau anulate. Folosiți getPendingNotificationRequests pentru a verifica coada curentă.
Când utilizatorul interacționează cu o notificare locală iOS, este apelată metoda userNotificationCenter:didReceive response a delegatului UNUserNotificationCenterDelegate. În această metodă sunt disponibile identificatorul cererii, actionIdentifier (care buton a fost apăsat) și userInfo personalizat. Acest lucru permite diferențierea între deschiderea simplă a notificării și apăsarea unui buton specific.
Pentru ca notificările locale să fie utile și să nu deranjeze utilizatorul, respectați câteva reguli cheie. Prima: controlați frecvența — nu mai mult de 2–3 notificări pe zi pentru evenimente non-critice, altfel utilizatorul va dezactiva toate notificările aplicației.
A doua: oferiți utilizatorului alegere. Adăugați în interfață posibilitatea de a dezactiva anumite tipuri de notificări locale. Pe Android este convenabil să folosiți un NotificationChannel separat cu importanță scăzută, pe iOS — o categorie separată în setările aplicației.
A treia: relevanță contextuală — notificarea ar trebui să apară când este necesară utilizatorului. Declanșatoarele geo sunt ideale pentru memento-uri despre treburi lângă casă, cele calendaristice — pentru întâlniri, cele pe interval — pentru acțiuni regulate precum băutul apei sau întinderile. Nu amestecați tipurile fără necesitate.
A patra: testați pe dispozitive reale. Simulatorul iOS nu emulează toate scenariile de livrare a notificărilor locale, în special în fundal. Pe Android folosiți adb shell dumpsys notification pentru a verifica coada notificărilor planificate și parametrii acestora. A cincea: oferiți întotdeauna utilizatorului posibilitatea de a dezactiva notificările prin interfața aplicației — aceasta este o cerință obligatorie de UX și a ghidurilor App Store Review.
Întrebări frecvente
Notificarea locală este planificată și livrată de dispozitiv fără participarea serverului. Notificarea push necesită un serviciu extern (FCM, APNS) și conexiune la internet. Cele locale funcționează offline, push — doar cu acces la rețea.
iOS limitează la 64 de cereri planificate simultan. Android nu are o limită strictă, dar peste 500 de notificări poate reduce performanța sistemului și poate afecta timpul de livrare.
Da, pe iOS folosiți removePendingNotificationRequests cu identificatorul cererii. Pe Android apelați NotificationManager.cancel sau anulați PendingIntent prin AlarmManager. Un identificator unic este obligatoriu pentru anulare.
Pe iOS permisiunea se solicită obligatoriu prin requestAuthorization. Pe Android 13+ (Tiramisu) este necesară și permisiunea POST_NOTIFICATIONS. Versiunile mai vechi de Android nu necesită permisiune explicită pentru notificări locale.
Pe iOS creați UNNotificationAction și adăugați în UNNotificationCategory. Pe Android folosiți NotificationCompat.Builder.addAction cu PendingIntent pentru BroadcastReceiver. Fiecare buton declanșează o acțiune separată în aplicație.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și