Notification Permission — to uprawnienie wymagane przez aplikację do wysyłania powiadomień push i lokalnych do użytkownika. Począwszy od Android 13 i iOS 12, aplikacje muszą prosić o to uprawnienie w czasie wykonania poprzez okno systemowe. Według Android Developers, 2024, bez wyraźnej zgody użytkownika aplikacja nie może wyświetlać powiadomień na urządzeniach z Android 13 i nowszym.
Najważniejsze
Notification Permission — to systemowe uprawnienie regulujące możliwość aplikacji do wysyłania powiadomień do użytkownika. Do Androida 13 wszystkie aplikacje mogły wyświetlać powiadomienia bez pytania — wystarczyło zadeklarować uprawnienie w manifeście. Jednak wraz ze wzrostem spamu i natrętnych powiadomień Google wprowadził obowiązkowe żądanie w czasie wykonania, podobnie jak w iOS.
Na iOS uprawnienie do powiadomień było obowiązkowe od iOS 8, a począwszy od iOS 12 pojawiły się provisional notifications — ciche powiadomienia, które są dostarczane bez dźwięku i wyświetlane w Centrum Powiadomień bez wyraźnego żądania. Provisional notifications pozwalają programiście pokazać użytkownikowi wartość powiadomień przed poproszeniem o pełne uprawnienie.
Według Localytics (2024), 61% użytkowników iOS i 55% użytkowników Androida zgadza się na otrzymywanie powiadomień push po prośbie. Konwersja zgody bezpośrednio zależy od kontekstu prośby: aplikacje proszące o uprawnienie po pierwszej wartościowej interakcji otrzymują o 40% więcej zgód niż te, które proszą przy pierwszym uruchomieniu.
Ewolucja uprawnień powiadomień pokazuje, jak platformy stopniowo ograniczały dostęp aplikacji do tego kanału komunikacji. Zrozumienie tej ewolucji pomaga programiście prawidłowo obsługiwać różne wersje systemu operacyjnego.
Do Androida 13 (2022) każda aplikacja mogła wyświetlać powiadomienia bez zgody użytkownika. Android 8.0 (2017) wprowadził kanały powiadomień, Android 12 (2021) dodał automatyczne blokowanie natrętnych powiadomień, a w końcu Android 13 nakazał proszenie o POST_NOTIFICATIONS w czasie wykonania. Dla aplikacji, których targetSdkVersion jest poniżej 33, system automatycznie przyznaje uprawnienie, ale Google Play wymaga aktualizacji targetSdkVersion do 33+ od sierpnia 2023 roku.
iOS 8 (2014) wprowadził obowiązkowe żądanie uprawnienia przez UIUserNotificationSettings. iOS 10 (2016) przedstawił UNUserNotificationCenter z obsługą rich notifications. iOS 12 (2018) dodał provisional notifications i grouped notifications. iOS 15 (2021) wprowadził Focus Mode, który może blokować powiadomienia niezależnie od uprawnienia aplikacji. App Tracking Transparency (iOS 14.5) nie jest związane z powiadomieniami, ale również wpłynęło na ogólną kulturę próś o uprawnienia.
Obecnie obie platformy wymagają żądania Notification Permission w czasie wykonania. Programista nie może już polegać na automatycznym włączeniu powiadomień. Użytkownik ma pełną kontrolę nad tym, które aplikacje mogą go powiadamiać. Notification channels na Android i kategorie powiadomień na iOS pozwalają użytkownikowi precyzyjnie dostosować typy otrzymywanych powiadomień.
Notification Permission na Android jest realizowane poprzez uprawnienie POST_NOTIFICATIONS, zadeklarowane w manifeście, z następczym żądaniem w czasie wykonania dla Android 13+.
Dla Android 13+ należy zadeklarować uprawnienie POST_NOTIFICATIONS w AndroidManifest.xml. Dla wstecznej kompatybilności z Android 12 i niższym uprawnienie jest automatycznie przyznawane przez system — nie wymaga dodatkowych działań.
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
Żądanie uprawnienia POST_NOTIFICATIONS jest wykonywane przez Activity Result API. Ważne jest sprawdzenie wersji SDK: na Android 12 i niższym żądanie nie jest wymagane, uprawnienie jest uważane za automatycznie przyznane.
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 i poniżej — uprawnienie przyznawane automatycznie
showNotification()
return
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
showNotification()
} else {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
Na Android 8.0+ aplikacja musi utworzyć kanał powiadomień przez NotificationChannel przed wysłaniem pierwszego powiadomienia. Kanał ma ważność (importance) od IMPORTANCE_NONE do IMPORTANCE_HIGH, która określa, czy powiadomienie będzie wyświetlane z dźwiękiem i jako baner. Jeśli użytkownik wyłączył powiadomienia dla aplikacji, nowe kanały nie będą miały efektu do ponownego włączenia w ustawieniach. Zaleca się tworzenie oddzielnych kanałów dla różnych typów powiadomień: wiadomości, reklamy, zdarzenia systemowe.
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID_MESSAGES,
"Wiadomości",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Powiadomienia o nowych wiadomościach"
enableVibration = true
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
Notification Permission na iOS jest wymagane przez UNUserNotificationCenter. Apple zaleca dwuetapowe podejście: najpierw poproś o provisional notifications, następnie, po pokazaniu wartości, pełne uprawnienie.
Provisional notifications to ciche powiadomienia, które trafiają do Centrum Powiadomień bez dźwięku i banera. Nie wymagają wyraźnej zgody użytkownika i pozwalają aplikacji pokazać wartość powiadomień przed pełnym żądaniem. Po otrzymaniu kilku provisional powiadomień użytkownik może włączyć pełne powiadomienia przez menu w samym powiadomieniu.
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żytkownik nie widzi okna dialogowego
// Powiadomienia przychodzą bez dźwięku w Centrum Powiadomień
registerForRemoteNotifications()
}
}
Obecny status Notification Permission na iOS można uzyskać przez UNUserNotificationCenter.current().getNotificationSettings. Status .authorized, .denied, .provisional lub .notDetermined pozwala aplikacji wybrać odpowiednie zachowanie. Po pierwszej odmowie okno systemowe nie jest ponownie wyświetlane — należy przekierować użytkownika do Ustawień przez UIApplication.openSettingsURLString. Apple zaleca również obsługę statusu .ephemeral (iOS 17+), który zapewnia tymczasowe powiadomienia dla określonych scenariuszy.
Najlepsze praktyki żądania Notification Permission mają na celu zwiększenie konwersji zgody i zmniejszenie odpływu użytkowników. Nieprawidłowe żądanie może nie tylko pozbawić aplikację możliwości wysyłania powiadomień, ale także doprowadzić do usunięcia aplikacji.
Najczęstszy antywzorzec — żądanie Notification Permission przy pierwszym uruchomieniu aplikacji. Użytkownik jeszcze nie rozumie wartości aplikacji i z dużym prawdopodobieństwem odmówi. Optymalny moment — po tym, jak użytkownik wykonał pierwsze docelowe działanie: złożył zamówienie, wysłał wiadomość, zasubskrybował aktualizacje. Post-value prompt zwiększa konwersję zgody do 65-75%.
Przed systemowym oknem dialogowym pokaż własny ekran z przykładami powiadomień, które użytkownik będzie otrzymywać. Pokaż makietę przyszłego powiadomienia z tekstem i ikoną. Jeśli użytkownik widzi, że powiadomienia będą przydatne i nieinwazyjne, z większym prawdopodobieństwem się zgodzi. Przykład powiadomienia na ekranie wstępnym to skuteczna technika zwiększająca konwersję o 35-50%.
Proaktywne żądanie Provisional Notifications na iOS pozwala dostarczać powiadomienia bez wyraźnej zgody użytkownika. Jeśli użytkownik widzi wartość w tych powiadomieniach, może włączyć pełne powiadomienia przez menu kontekstowe powiadomienia. Apple zaleca to podejście dla aplikacji informacyjnych, pogodowych i innych usług, gdzie powiadomienia są informacyjne, a nie transakcyjne. Według Apple WWDC 2024, to podejście zwiększa konwersję pełnej zgody o 20-30%.
Często zadawane pytania
Po odmowie okno systemowe nie jest ponownie wyświetlane. Jedynym sposobem włączenia powiadomień jest przekierowanie użytkownika do ustawień systemowych przez Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) na Android lub UIApplication.openSettingsURLString na iOS. Pokaż ekran z instrukcją i przyciskiem przejścia.
Na Android 12 i niższym Notification Permission nie jest wymagane — wszystkie aplikacje mogą wysyłać powiadomienia bez pytania. Jednak użytkownik może wyłączyć powiadomienia w dowolnym momencie przez ustawienia systemowe. Począwszy od Androida 13, żądanie w czasie wykonania jest obowiązkowe dla targetSdkVersion 33+.
NotificationChannel — to kategoria powiadomień wprowadzona w Android 8.0. Każdy kanał ma nazwę, opis, ważność (importance) i grupę. Użytkownik może wyłączać poszczególne kanały bez wyłączania wszystkich powiadomień aplikacji. Na przykład kanał „Nowe wiadomości” i kanał „Newsletter reklamowe” można skonfigurować różnie.
Na Android 13+ bez POST_NOTIFICATIONS każde wywołanie NotificationManager.notify zostanie zignorowane przez system. Na iOS bez uprawnienia UNUserNotificationCenter powiadomienia nie są dostarczane. Wyjątek: Provisional na iOS (bez dźwięku, tylko w Centrum Powiadomień) i Android 12- (uprawnienie nie jest wymagane).
Na Android użyj NotificationManagerCompat.areNotificationsEnabled(). Na iOS wywołaj UNUserNotificationCenter.current().getNotificationSettings i sprawdź właściwość authorizationStatus. Dla Androida dodatkowo sprawdź ważność kanału: NotificationChannel.getImportance() nie powinno być IMPORTANCE_NONE.
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ż