Lokální oznámení je zpráva, kterou aplikace odesílá uživateli bez účasti vzdáleného serveru. Všechna data jsou zpracovávána a zobrazována přímo na zařízení příjemce. Tento mechanismus je vhodný pro připomínky, časovače a budíky, když je aplikace na pozadí nebo zavřená. Podle Apple Developer Documentation, UNUserNotificationCenter poskytuje centralizovanou správu lokálních oznámení na iOS.
Hlavní body
Lokální oznámení je triggerovaná zpráva, kterou generuje a zobrazuje operační systém na stejném zařízení, kde je aplikace nainstalována. Na rozdíl od push oznámení, lokální neprocházejí přes externí server — veškerá logika plánování se provádí na straně klienta.
Taková oznámení fungují bez ohledu na stav aplikace: aktivní, minimalizovaná nebo zcela zavřená. Operační systém přebírá doručení v určený čas a vývojář specifikuje pouze obsah a spouštěč.
Systém garantuje doručení lokálního oznámení i bez sítě. To je klíčová výhoda oproti push oznámením, která vyžadují stabilní internetové připojení a funkční server.
Každé lokální oznámení se skládá ze tří částí: obsah (název, tělo, zvuk), spouštěč (časová nebo geo-podmínka) a identifikátor požadavku. Identifikátor umožňuje zrušit nebo aktualizovat oznámení před jeho doručením.
Vývojář může nastavit až 64 lokálních oznámení pro jednu aplikaci na iOS a neomezený počet na Androidu. Rozdíl souvisí s architektonickými omezeními operačních systémů.
Obě platformy poskytují vlastní API pro práci s lokálními oznámeními. Na iOS je centrálním prvkem UNUserNotificationCenter, na Androidu — NotificationManager. Přes různé rozhraní je logika stejná: aplikace vytvoří požadavek, zaregistruje jej v systému a OS doručí oznámení v určený čas.
iOS používá UNCalendarNotificationTrigger pro kalendářní události, UNTimeIntervalNotificationTrigger pro intervaly a UNLocationNotificationTrigger pro geolokaci. Android nabízí AlarmManager, WorkManager a přesné plánování přes setExact.
Od verze Android 12 — SCHEDULE_EXACT_ALARM vyžaduje speciální oprávnění od uživatele. Na iOS je oprávnění vyžadováno jednou prostřednictvím UNUserNotificationCenter.requestAuthorization a uživatel volí úroveň přístupu: bannery, zvuky, odznaky.
Lokální oznámení se klasifikují podle typu spouštěče, nikoli podle obsahu. Každý typ určuje, kdy a za jakých podmínek bude oznámení uživateli zobrazeno.
Na iOS a Androidu jsou typy spouštěčů implementovány odlišně, i když logická klasifikace je stejná. iOS používá UNCalendarNotificationTrigger pro data, UNTimeIntervalNotificationTrigger pro intervaly a UNLocationNotificationTrigger pro geolokaci. Android nabízí AlarmManager s setExact a setRepeating, a také WorkManager pro zpožděné úkoly.
| Typ spouštěče | Popis | Příklad |
|---|---|---|
| Časový interval | Oznámení po N sekundách od spuštění | Časovač odpočítávání |
| Kalendářní datum | Oznámení v konkrétní čas a datum | Připomínka schůzky |
| Geolokace | Oznámení při vstupu/výstupu z oblasti | Připomínka u obchodu |
| Bezpodmínečné | Okamžité doručení při volání API | Oznámení o stahování |
Na iOS je také k dispozici UNNotificationAttachment — příloha obrázku, zvuku nebo videa v těle oznámení. Android podporuje vlastní šablony s tlačítky a velkými obrázky prostřednictvím NotificationCompat.Style.
Výběr spouštěče závisí na scénáři: kalendářní připomínky fungují nejlépe přes kalendářní spouštěč a geo-připomínky — přes geolokaci. Intervalové spouštěče jsou vhodné pro pravidelné události s pevnou periodou.
Na iOS jsou lokální oznámení doručována systémem i při zavřené aplikaci — UNUserNotificationCenter spravuje frontu samostatně. Na Androidu doručení závisí na zvoleném mechanismu: AlarmManager se aktivuje i při vypnuté obrazovce, zatímco WorkManager zohledňuje úsporu energie.
Lokální oznámení řeší úkoly, kde je externí infrastruktura nadbytečná nebo nedostupná. Hlavní scénáře: připomínky, časovače, vzdělávací tipy a zpožděné akce.
Výzkumy Localytics ukazují, že aplikace používající lokální připomínky si udrží o 35 % více uživatelů v prvním týdnu po instalaci. To činí lokální oznámení mocným nástrojem onboardingu.
Je důležité nezneužívat frekvenci — systém sám seskupuje oznámení z jedné aplikace a uživatel může všechna lokální oznámení vypnout, pokud ho obtěžují. Optimální frekvence není více než 2–3 oznámení denně pro nekritické události.
Pro plánování lokálního oznámení na Androidu použijte NotificationManager ve spojení s AlarmManager. Od Android 8+ je nejprve nutné vytvořit kanál oznámení, jinak se oznámení nezobrazí.
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"
val channel = NotificationChannel(
channelId,
"Připomínky",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Kanál pro připomínky úkolů"
}
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+ zkontrolujte oprávnění SCHEDULE_EXACT_ALARM před voláním setExact. Pokud oprávnění nebylo uděleno — použijte setWindow, který garantuje doručení v časovém okně.
Při aktivaci AlarmManager systém odešle broadcast Intent, který přijímá BroadcastReceiver. Uvnitř něj je nutné vytvořit a zobrazit oznámení prostřednictvím NotificationManager. Ujistěte se, že PendingIntent používá FLAG_UPDATE_CURRENT, jinak při změně dat budou stará oznámení nadále používat zastaralý Intent.
Na iOS se lokální oznámení vytvářejí prostřednictvím UNUserNotificationCenter pomocí UNMutableNotificationContent a jednoho ze spouštěčů. Před plánováním je nutné požádat uživatele o oprávnění.
import UserNotifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
guard granted else { return }
}
let content = UNMutableNotificationContent()
content.title = "Připomínka úkolu"
content.body = "Nezapomeňte dokončit zprávu 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 podporuje až 64 současných požadavků na lokální oznámení. Pokud je limit překročen — systém odmítá nové požadavky, dokud nejsou aktivní doručeny nebo zrušeny. Pro kontrolu aktuální fronty použijte getPendingNotificationRequests.
Když uživatel interaguje s lokálním oznámením na iOS, je volána metoda userNotificationCenter:didReceive response delegáta UNUserNotificationCenterDelegate. V této metodě jsou k dispozici identifikátor požadavku, actionIdentifier (které tlačítko bylo stisknuto) a vlastní userInfo. To umožňuje rozlišit prosté otevření oznámení od stisknutí konkrétního tlačítka akce.
Aby byla lokální oznámení užitečná a neobtěžovala uživatele, dodržujte několik klíčových pravidel. Za prvé: kontrolujte frekvenci — ne více než 2–3 oznámení denně pro nekritické události, jinak uživatel vypne všechna oznámení aplikace.
Za druhé: dejte uživateli na výběr. Přidejte do rozhraní možnost vypnout určité typy lokálních oznámení. Na Androidu je k tomu vhodné použít samostatný NotificationChannel s nízkou důležitostí, na iOS — samostatnou kategorii v nastavení aplikace.
Za třetí: kontextuální relevance — oznámení by se mělo objevit, když ho uživatel potřebuje. Geo-spouštěče jsou ideální pro připomínky úkolů poblíž domova, kalendářní — pro schůzky, intervalové — pro pravidelné činnosti jako pití vody nebo protahování. Nemíchejte typy bez potřeby.
Za čtvrté: testujte na skutečných zařízeních. Simulátor iOS neemuluje všechny scénáře doručení lokálních oznámení, zejména na pozadí. Na Androidu použijte adb shell dumpsys notification pro kontrolu fronty plánovaných oznámení a jejich parametrů. Za páté: vždy poskytněte uživateli možnost vypnout oznámení prostřednictvím rozhraní aplikace — to je povinný požadavek UX a pokynů App Store Review.
Často kladené otázky
Lokální oznámení je plánováno a doručováno zařízením bez účasti serveru. Push oznámení vyžaduje externí službu (FCM, APNS) a internetové připojení. Lokální fungují offline, push — pouze s přístupem k síti.
iOS omezuje na 64 současně plánovaných požadavků. Android nemá přísný limit, ale přes 500 oznámení může snížit výkon systému a ovlivnit dobu doručení.
Ano, na iOS použijte removePendingNotificationRequests s identifikátorem požadavku. Na Androidu zavolejte NotificationManager.cancel nebo zrušte PendingIntent přes AlarmManager. Jedinečný identifikátor je pro zrušení povinný.
Na iOS je oprávnění povinně vyžadováno prostřednictvím requestAuthorization. Na Android 13+ (Tiramisu) je také vyžadováno oprávnění POST_NOTIFICATIONS. Starší verze Androidu nevyžadují výslovné oprávnění pro lokální oznámení.
Na iOS vytvořte UNNotificationAction a přidejte do UNNotificationCategory. Na Androidu použijte NotificationCompat.Builder.addAction s PendingIntent pro BroadcastReceiver. Každé tlačítko spouští samostatnou akci v aplikaci.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také