Powiadomienia lokalne w programowaniu mobilnym: istota, rodzaje i jak działają

Autor: IT Sectr Opublikowano: 2026-03-19 Czas czytania: 8 min

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 — wiadomość planowana i dostarczana przez urządzenie bez udziału serwera
  • Platformy — Android używa NotificationManager, iOS używa UNUserNotificationCenter
  • Planowanie — powiadomienia mogą być opóźnione według czasu, geolokalizacji lub kalendarza
  • Ograniczenia — powiadomienia lokalne nie działają między urządzeniami i wymagają oddzielnej logiki synchronizacji
  • UX — prawidłowo skonfigurowane powiadomienia zwiększają zaangażowanie i przyciągają użytkownika z powrotem do aplikacji

Co to jest powiadomienie lokalne?

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.

Główne składniki żądania

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.

Jak działają powiadomienia lokalne na iOS i Android?

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.

Rodzaje powiadomień lokalnych

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.

Porównanie wyzwalaczy według platform

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 wyzwalaczaOpisPrzykład
Interwał czasowyPowiadomienie po N sekundach od uruchomieniaTimer odliczania
Data kalendarzowaPowiadomienie o konkretnej godzinie i daciePrzypomnienie o spotkaniu
GeolokalizacjaPowiadomienie przy wejściu/wyjściu z regionuPrzypomnienie przy sklepie
BezwarunkoweNatychmiastowe dostarczenie przy wywołaniu APIPowiadomienie 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.

Zachowanie wyzwalaczy w tle

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.

Scenariusze użycia w aplikacjach mobilnych

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.

  • Przypomnienia — aplikacja kalendarza tworzy powiadomienie lokalne na określoną datę wydarzenia
  • Wskazówki szkoleniowe — dzień po instalacji aplikacja pokazuje poradę dotyczącą ekranu
  • Timery — timer kuchenny uruchamia się po zadanym czasie nawet przy zamkniętej aplikacji
  • Postęp operacji — powiadomienie o zakończeniu pobierania lub eksportu danych

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.

Przykład planowania na Android

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.

kotlin
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.

Obsługa w BroadcastReceiver

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.

Przykład planowania na iOS

Na iOS powiadomienia lokalne tworzy się przez UNUserNotificationCenter za pomocą UNMutableNotificationContent i jednego z wyzwalaczy. Przed planowaniem należy poprosić użytkownika o pozwolenie.

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 = "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.

Obsługa odpowiedzi delegata

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.

Najlepsze praktyki powiadomień lokalnych

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

Czym różni się powiadomienie lokalne od push?

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.

Ile powiadomień lokalnych można zaplanować?

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.

Czy można anulować powiadomienie lokalne po zaplanowaniu?

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.

Czy potrzebne jest pozwolenie użytkownika na powiadomienia lokalne?

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.

Jak dodać przyciski do powiadomienia lokalnego?

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

  • Powiadomienia lokalne — wiadomości planowane i dostarczane przez urządzenie bez infrastruktury serwerowej
  • UNUserNotificationCenter — główne API do pracy z powiadomieniami lokalnymi na iOS
  • NotificationManager — główne API do pracy z powiadomieniami lokalnymi na Android
  • Typy wyzwalaczy — interwał czasowy, data kalendarzowa, geolokalizacja i dostarczenie bezwarunkowe
  • Limity — iOS ogranicza do 64 zaplanowanych żądań, Android nie ma ścisłego ograniczenia
  • Pozwolenia — na iOS i Android 13+ wymagana jest wyraźna zgoda użytkownika na wyświetlanie powiadomień
  • Offline — powiadomienia lokalne działają bez połączenia internetowego, co czyni je bardziej niezawodnymi niż push

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.

Omów projekt

Przeczytaj również