Notification Permission — to je oprávnění, které aplikace potřebuje k odesílání push oznámení a lokálních oznámení uživateli. Počínaje Androidem 13 a iOS 12 jsou aplikace povinny toto oprávnění žádat během runtime prostřednictvím systémového dialogu. Podle Android Developers, 2024 bez výslovného souhlasu uživatele aplikace nemůže zobrazovat oznámení na zařízeních s Androidem 13 a novějších.
Hlavní body
Notification Permission — to je systémové oprávnění, které reguluje schopnost aplikace odesílat oznámení uživateli. Až do Androidu 13 mohly všechny aplikace zobrazovat oznámení bez žádosti — stačilo deklarovat oprávnění v manifestu. S nárůstem spamu a rušivých oznámení však Google zavedl povinnou runtime žádost, podobně jako u iOS.
Na iOS bylo oprávnění k oznámením povinné od iOS 8 a od iOS 12 se objevila prozatímní (provisional) oznámení — tichá oznámení, která jsou doručena bez zvuku a zobrazena v Centru oznámení bez výslovné žádosti. Prozatímní oznámení umožňují vývojáři ukázat uživateli hodnotu oznámení před tím, než požádá o úplné oprávnění.
Podle Localytics (2024) 61% uživatelů iOS a 55% uživatelů Androidu souhlasí s příjmem push oznámení po žádosti. Míra konverze souhlasu přímo závisí na kontextu žádosti: aplikace, které žádají o oprávnění po první hodnotné interakci, získají o 40% více souhlasů než ty, které žádají při prvním spuštění.
Vývoj oprávnění pro oznámení ukazuje, jak platformy postupně omezovaly přístup aplikací k tomuto komunikačnímu kanálu. Pochopení tohoto vývoje pomáhá vývojáři správně zacházet s různými verzemi operačního systému.
Až do Androidu 13 (2022) mohla jakákoli aplikace zobrazovat oznámení bez souhlasu uživatele. Android 8.0 (2017) zavedl kanály oznámení, Android 12 (2021) přidal automatické blokování rušivých oznámení a nakonec Android 13 nařídil žádost o POST_NOTIFICATIONS během runtime. Pro aplikace s targetSdkVersion nižším než 33 systém automaticky uděluje oprávnění, ale Google Play vyžaduje aktualizaci targetSdkVersion na 33+ od srpna 2023.
iOS 8 (2014) zavedl povinnou žádost o oprávnění prostřednictvím UIUserNotificationSettings. iOS 10 (2016) představil UNUserNotificationCenter s podporou bohatých oznámení. iOS 12 (2018) přidal prozatímní oznámení a seskupená oznámení. iOS 15 (2021) zavedl Focus Mode, který může blokovat oznámení nezávisle na oprávnění aplikace. App Tracking Transparency (iOS 14.5) nesouvisí s oznámeními, ale také ovlivnila celkovou kulturu žádostí o oprávnění.
V současné době obě platformy vyžadují žádost o Notification Permission během runtime. Vývojář se již nemůže spoléhat na automatické zapnutí oznámení. Uživatel má úplnou kontrolu nad tím, které aplikace ho mohou upozorňovat. Kanály oznámení na Androidu a kategorie oznámení na iOS umožňují uživateli přesně nastavit typy přijímaných oznámení.
Notification Permission na Androidu se realizuje prostřednictvím oprávnění POST_NOTIFICATIONS deklarovaného v manifestu s runtime žádostí pro Android 13+.
Pro Android 13+ musíte deklarovat oprávnění POST_NOTIFICATIONS v AndroidManifest.xml. Pro zpětnou kompatibilitu s Androidem 12 a nižšími verzemi je oprávnění automaticky udělováno systémem — nejsou vyžadovány žádné další akce.
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
Žádost o oprávnění POST_NOTIFICATIONS se provádí prostřednictvím Activity Result API. Je důležité zkontrolovat verzi SDK: na Androidu 12 a nižších verzích není žádost vyžadována, oprávnění se považuje za automaticky udělené.
private val notificationPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
if (granted) {
createNotificationChannel()
showPushNotification()
} else {
logPermissionDenied()
}
}
fun requestNotificationAccess() {
if (Build.version.SDK_INT <= Build.VERSION_CODES.S_V2) {
// Android 12 a niže — oprávnění je uděleno automaticky
showNotification()
return
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
showNotification()
} else {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
Na Androidu 8.0+ musí aplikace vytvořit kanál oznámení prostřednictvím NotificationChannel před odesláním prvního oznámení. Kanál má důležitost (importance) od IMPORTANCE_NONE do IMPORTANCE_HIGH, která určuje, zda se oznámení zobrazí se zvukem a jako banner. Pokud uživatel zakázal oznámení pro aplikaci, nové kanály nebudou mít účinek, dokud nebudou znovu povoleny v nastavení. Doporučuje se vytvářet samostatné kanály pro různé typy oznámení: zprávy, reklamy, systémové události.
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID_MESSAGES,
"Zprávy",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Oznámení o nových zprávách"
enableVibration = true
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
Notification Permission na iOS se žádá prostřednictvím UNUserNotificationCenter. Apple doporučuje dvoukrokový přístup: nejprve požádat o prozatímní oznámení, poté po prokázání hodnoty o úplné oprávnění.
Prozatímní oznámení jsou tichá oznámení, která přicházejí do Centra oznámení bez zvuku a banneru. Nevyžadují výslovný souhlas uživatele a umožňují aplikaci ukázat hodnotu oznámení před úplnou žádostí. Po obdržení několika prozatímních oznámení může uživatel zapnout úplná oznámení prostřednictvím nabídky v samotném oznámení.
import UserNotifications
func requestNotificationPermission() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
if let error = error {
print("Notification error: \(error.localizedDescription)")
return
}
if granted {
registerForRemoteNotifications()
} else {
handleDeniedPermission()
}
}
}
func requestProvisionalOnly() {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.provisional, .alert, .badge, .sound]) { granted, error in
// Provisional — uživatel nevidí dialog
// Oznámení přicházejí bez zvuku do Centra oznámení
registerForRemoteNotifications()
}
}
Aktuální stav Notification Permission na iOS lze získat prostřednictvím UNUserNotificationCenter.current().getNotificationSettings. Stavy .authorized, .denied, .provisional nebo .notDetermined umožňují aplikaci vybrat správné chování. Po prvním odmítnutí se systémový dialog již nezobrazí — je třeba přesměrovat uživatele do Nastavení prostřednictvím UIApplication.openSettingsURLString. Apple také doporučuje zpracovávání stavu .ephemeral (iOS 17+), který poskytuje dočasná oznámení pro konkrétní scénáře.
Nejlepší postupy pro žádost o Notification Permission jsou zaměřeny na zvýšení míry konverze souhlasu a snížení odchodu uživatelů. Nesprávná žádost může nejen připravit aplikaci o možnost odesílat oznámení, ale také vést k odstranění aplikace.
Nejčastější antimuster — žádost o Notification Permission při prvním spuštění aplikace. Uživatel ještě nechápe hodnotu aplikace a s velkou pravděpodobností odmítne. Optimální okamžik — poté, co uživatel provedl první cílenou akci: zadal objednávku, odeslal zprávu, přihlásil se k odběru aktualizací. Žádost po hodnotě zvyšuje míru konverze souhlasu na 65-75%.
Před systémovým dialogem zobrazte vlastní obrazovku s příklady oznámení, které bude uživatel dostávat. Ukažte maketu budoucího oznámení s textem a ikonou. Pokud uživatel vidí, že oznámení budou užitečná a nevtíravá, je pravděpodobnější, že souhlasí. Příklad oznámení na předběžné obrazovce je účinná technika, která zvyšuje konverzi o 35-50%.
Proaktivní žádost o prozatímní oznámení na iOS umožňuje doručovat oznámení bez výslovného souhlasu uživatele. Pokud uživatel vidí v těchto oznámeních hodnotu, může zapnout úplná oznámení prostřednictvím kontextové nabídky oznámení. Apple doporučuje tento přístup pro zpravodajské aplikace, počasí a další služby, kde jsou oznámení informativní, nikoli transakční. Podle Apple WWDC 2024 tento přístup zvyšuje míru konverze úplného souhlasu o 20-30%.
Často kladené otázky
Po odmítnutí se systémový dialog již nezobrazí. Jediným způsobem, jak zapnout oznámení, je přesměrovat uživatele do systémových nastavení prostřednictvím Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) na Androidu nebo UIApplication.openSettingsURLString na iOS. Zobrazte obrazovku s instrukcemi a tlačítkem pro navigaci.
Na Androidu 12 a nižších verzích Notification Permission není vyžadováno — všechny aplikace mohou odesílat oznámení bez žádosti. Uživatel však může oznámení kdykoli zakázat prostřednictvím systémových nastavení. Počínaje Androidem 13 je runtime žádost povinná pro targetSdkVersion 33+.
NotificationChannel — je kategorie oznámení zavedená v Androidu 8.0. Každý kanál má název, popis, důležitost (importance) a skupinu. Uživatel může vypínat jednotlivé kanály bez vypnutí všech oznámení aplikace. Například kanál „Nové zprávy” a kanál „Reklamní newsletter” lze konfigurovat odlišně.
Na Androidu 13+ bez POST_NOTIFICATIONS bude jakýkoli hovor NotificationManager.notify ignorován systémem. Na iOS bez oprávnění UNUserNotificationCenter nejsou oznámení doručena. Výjimka: Provisional na iOS (bez zvuku, pouze v Centru oznámení) a Android 12- (oprávnění není vyžadováno).
Na Androidu použijte NotificationManagerCompat.areNotificationsEnabled(). Na iOS zavolejte UNUserNotificationCenter.current().getNotificationSettings a zkontrolujte vlastnost authorizationStatus. Pro Android také zkontrolujte důležitost kanálu: NotificationChannel.getImportance() by neměla být IMPORTANCE_NONE.
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é