Powiadomienie lokalne to wiadomość wysyłana przez aplikację do użytkownika bez udziału zdalnego serwera. Wszystkie dane są przetwarzane i wyświetlane bezpośrednio na urządzeniu odbiorcy. Taki mechanizm sprawdza się w przypadku przypomnień, timerów i budzików, gdy aplikacja działa w tle lub jest zamknięta. Według Apple Developer Documentation, UNUserNotificationCenter zapewnia scentralizowane zarządzanie powiadomieniami lokalnymi na iOS.
Najważniejsze
Powiadomienie lokalne to wiadomość wyzwalana i wyświetlana przez system operacyjny na tym samym urządzeniu, na którym zainstalowana jest aplikacja. W przeciwieństwie do powiadomień push, lokalne nie przechodzą przez zewnętrzny serwer — cała logika planowania wykonywana jest po stronie klienta.
Takie powiadomienia działają niezależnie od stanu aplikacji: czy jest aktywna, zminimalizowana czy całkowicie zamknięta. System operacyjny przejmuje dostarczenie w wyznaczonym czasie, a programista określa jedynie treść i wyzwalacz.
System gwarantuje dostarczenie powiadomienia lokalnego nawet przy braku sieci. To kluczowa przewaga nad powiadomieniami push, które wymagają stabilnego połączenia internetowego i działającego serwera.
Każde powiadomienie lokalne składa się z trzech części: treści (tytuł, treść, dźwięk), wyzwalacza (warunek czasowy lub geolokalizacyjny) oraz identyfikatora żądania. Identyfikator pozwala anulować lub zaktualizować powiadomienie przed jego dostarczeniem.
Programista może ustawić do 64 powiadomień lokalnych na jedną aplikację w iOS i nieograniczoną liczbę w Android. Różnica wynika z architektonicznych ograniczeń systemów operacyjnych.
Obie platformy udostępniają własne API do pracy z powiadomieniami lokalnymi. Na iOS centralnym elementem jest UNUserNotificationCenter, na Android — NotificationManager. Mimo różnych interfejsów logika jest taka sama: aplikacja tworzy żądanie, rejestruje je w systemie, a OS dostarcza powiadomienie w określonym momencie.
iOS używa UNCalendarNotificationTrigger dla zdarzeń kalendarzowych, UNTimeIntervalNotificationTrigger dla interwałów i UNLocationNotificationTrigger dla geolokalizacji. Android oferuje AlarmManager, WorkManager i dokładne planowanie przez setExact.
Od wersji Android 12 — SCHEDULE_EXACT_ALARM wymaga specjalnego pozwolenia od użytkownika. Na iOS pozwolenie jest wymagane jednorazowo przez UNUserNotificationCenter.requestAuthorization, a użytkownik wybiera poziom dostępu: banery, dźwięki, ikony.
Powiadomienia lokalne klasyfikuje się według typu wyzwalacza, a nie treści. Każdy typ określa, kiedy i pod jakimi warunkami powiadomienie zostanie pokazane użytkownikowi.
Na iOS i Android typy wyzwalaczy są zaimplementowane różnie, chociaż logiczna klasyfikacja jest taka sama. iOS używa UNCalendarNotificationTrigger dla dat, UNTimeIntervalNotificationTrigger dla interwałów i UNLocationNotificationTrigger dla geolokalizacji. Android oferuje AlarmManager z setExact i setRepeating, a także WorkManager dla zadań opóźnionych.
| Typ wyzwalacza | Opis | Przykład |
|---|---|---|
| Interwał czasowy | Powiadomienie po N sekundach od uruchomienia | Timer odliczania |
| Data kalendarzowa | Powiadomienie o konkretnej godzinie i dacie | Przypomnienie o spotkaniu |
| Geolokalizacja | Powiadomienie przy wejściu/wyjściu z regionu | Przypomnienie przy sklepie |
| Bezwarunkowe | Natychmiastowe dostarczenie przy wywołaniu API | Powiadomienie o pobieraniu |
Na iOS dostępny jest również UNNotificationAttachment — załącznik obrazu, audio lub wideo w treści powiadomienia. Android obsługuje niestandardowe szablony z przyciskami i dużymi obrazami przez NotificationCompat.Style.
Wybór wyzwalacza zależy od scenariusza: przypomnienia kalendarzowe najlepiej działają przez wyzwalacz kalendarzowy, a geo-przypomnienia — przez geolokalizację. Wyzwalacze interwałowe nadają się do regularnych zdarzeń o ustalonym okresie.
Na iOS powiadomienia lokalne są dostarczane przez system nawet przy zamkniętej aplikacji — UNUserNotificationCenter zarządza kolejką samodzielnie. Na Android dostarczenie zależy od wybranego mechanizmu: AlarmManager uruchamia się nawet przy wyłączonym ekranie, a WorkManager — z uwzględnieniem oszczędzania energii.
Powiadomienia lokalne rozwiązują zadania, w których zewnętrzna infrastruktura jest zbędna lub niedostępna. Główne scenariusze: przypomnienia, timery, wskazówki szkoleniowe i odroczone działania.
Badania Localytics pokazują, że aplikacje używające lokalnych przypomnień zatrzymują o 35% więcej użytkowników w pierwszym tygodniu po instalacji. To czyni powiadomienia lokalne potężnym narzędziem onboardingu.
Ważne, aby nie nadużywać częstotliwości — system sam grupuje powiadomienia z jednej aplikacji, a użytkownik może wyłączyć wszystkie powiadomienia lokalne, jeśli mu przeszkadzają. Optymalna częstotliwość to nie więcej niż 2–3 powiadomienia dziennie dla zdarzeń niekrytycznych.
Do planowania powiadomienia lokalnego na Android użyj NotificationManager w parze z AlarmManager. Od Android 8+ należy najpierw utworzyć kanał powiadomień, w przeciwnym razie powiadomienie nie zostanie wyświetlone.
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"
val channel = NotificationChannel(
channelId,
"Przypomnienia",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Kanał dla przypomnień o zadaniach"
}
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
)
Na Android 12+ sprawdź uprawnienie SCHEDULE_EXACT_ALARM przed wywołaniem setExact. Jeśli uprawnienie nie zostało przyznane — użyj setWindow, który gwarantuje dostarczenie w określonym oknie czasowym.
Po uruchomieniu AlarmManager system wysyła rozgłaszany Intent, który odbiera BroadcastReceiver. Wewnątrz niego należy utworzyć i wyświetlić powiadomienie przez NotificationManager. Upewnij się, że PendingIntent używa FLAG_UPDATE_CURRENT, w przeciwnym razie przy zmianie danych stare powiadomienia będą nadal używać przestarzałego Intent.
Na iOS powiadomienia lokalne tworzy się przez UNUserNotificationCenter za pomocą UNMutableNotificationContent i jednego z wyzwalaczy. Przed planowaniem należy poprosić użytkownika o pozwolenie.
import UserNotifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
guard granted else { return }
}
let content = UNMutableNotificationContent()
content.title = "Przypomnienie o zadaniu"
content.body = "Nie zapomnij dokończyć raportu do 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 obsługuje do 64 jednoczesnych żądań powiadomień lokalnych. Jeśli limit zostanie przekroczony — system odrzuca nowe żądania, dopóki aktywne nie zostaną dostarczone lub anulowane. Użyj getPendingNotificationRequests do sprawdzenia bieżącej kolejki.
Gdy użytkownik wchodzi w interakcję z powiadomieniem lokalnym iOS, wywoływana jest metoda userNotificationCenter:didReceive response delegata UNUserNotificationCenterDelegate. W tej metodzie dostępne są identyfikator żądania, actionIdentifier (który przycisk został naciśnięty) i niestandardowe userInfo. Pozwala to odróżnić zwykłe otwarcie powiadomienia od naciśnięcia konkretnego przycisku.
Aby powiadomienia lokalne były przydatne, a nie denerwowały użytkownika, przestrzegaj kilku kluczowych zasad. Po pierwsze: kontroluj częstotliwość — nie więcej niż 2–3 powiadomienia dziennie dla zdarzeń niekrytycznych, w przeciwnym razie użytkownik wyłączy wszystkie powiadomienia aplikacji.
Po drugie: daj użytkownikowi wybór. Dodaj w interfejsie możliwość wyłączenia określonych typów powiadomień lokalnych. Na Android wygodnie jest do tego użyć osobnego NotificationChannel z niskim importance, na iOS — osobnej kategorii w ustawieniach aplikacji.
Po trzecie: trafność kontekstowa — powiadomienie powinno pojawiać się, gdy jest potrzebne użytkownikowi. Wyzwalacze geo są idealne do przypomnień o sprawach w pobliżu domu, kalendarzowe — do spotkań, interwałowe — do regularnych czynności, takich jak picie wody czy rozciąganie. Nie mieszaj typów bez potrzeby.
Po czwarte: testuj na rzeczywistych urządzeniach. Symulator iOS nie emuluje wszystkich scenariuszy dostarczania powiadomień lokalnych, szczególnie w tle. Na Android użyj adb shell dumpsys notification do sprawdzenia kolejki zaplanowanych powiadomień i ich parametrów. Po piąte: zawsze zapewnij użytkownikowi możliwość wyłączenia powiadomień przez interfejs aplikacji — to obowiązkowy wymóg UX i wytycznych App Store Review Guidelines.
Często zadawane pytania
Powiadomienie lokalne jest planowane i dostarczane przez urządzenie bez udziału serwera. Powiadomienie push wymaga zewnętrznego serwisu (FCM, APNS) i połączenia internetowego. Lokalne działają offline, push — tylko przy dostępie do sieci.
iOS ogranicza do 64 jednocześnie zaplanowanych żądań. Android nie ma ścisłego limitu, ale powyżej 500 powiadomień może obniżyć wydajność systemu i wpłynąć na czas dostarczenia.
Tak, na iOS użyj removePendingNotificationRequests z identyfikatorem żądania. Na Android wywołaj NotificationManager.cancel lub anuluj PendingIntent przez AlarmManager. Unikalny identyfikator jest wymagany do anulowania.
Na iOS pozwolenie jest wymagane obowiązkowo przez requestAuthorization. Na Android 13+ (Tiramisu) również wymagane jest pozwolenie POST_NOTIFICATIONS. Starsze wersje Android nie wymagają jawnego pozwolenia na powiadomienia lokalne.
Na iOS utwórz UNNotificationAction i dodaj do UNNotificationCategory. Na Android użyj NotificationCompat.Builder.addAction z PendingIntent na BroadcastReceiver. Każdy przycisk uruchamia oddzielną akcję w aplikacji.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również