Notification Permission — це дозвіл, необхідний додатку для надсилання push-сповіщень та локальних сповіщень користувачу. Починаючи з Android 13 та iOS 12, додатки зобов’язані запитувати цей дозвіл під час виконання через системний діалог. Згідно з Android Developers, 2024, без явної згоди користувача додаток не може показувати сповіщення на пристроях з Android 13 та вище.
Головне
Notification Permission — це системний дозвіл, що регулює можливість додатку надсилати сповіщення користувачу. До Android 13 всі додатки могли показувати сповіщення без запиту — достатньо було оголосити дозвіл у маніфесті. Однак зі зростанням спаму та нав’язливих сповіщень Google ввів обов’язковий запит під час виконання, аналогічний iOS.
На iOS дозвіл на сповіщення був обов’язковим з iOS 8, а починаючи з iOS 12 з’явилися тимчасові сповіщення (provisional notifications) — тихі сповіщення, які доставляються без звуку та відображаються в Центрі сповіщень без явного запиту. Тимчасові сповіщення дозволяють розробнику показати користувачу цінність сповіщень до того, як запитувати повний дозвіл.
За даними Localytics (2024), 61% користувачів iOS та 55% користувачів Android погоджуються на отримання push-сповіщень після запиту. Конверсія схвалення безпосередньо залежить від контексту запиту: додатки, які запитують дозвіл після першої цінної взаємодії, отримують на 40% більше згод, ніж ті, що запитують при першому запуску.
Еволюція дозволів на сповіщення показує, як платформи поетапно обмежували доступ додатків до цього каналу комунікації. Розуміння цієї еволюції допомагає розробнику правильно обробляти різні версії ОС.
До Android 13 (2022) будь-який додаток міг показувати сповіщення без згоди користувача. Android 8.0 (2017) ввів канали сповіщень, Android 12 (2021) додав автоматичне блокування нав’язливих сповіщень, і нарешті Android 13 зобов’язав запитувати POST_NOTIFICATIONS під час виконання. Для додатків, targetSdkVersion яких нижче 33, система автоматично надає дозвіл, але Google Play вимагає оновлення targetSdkVersion до 33+ з серпня 2023 року.
iOS 8 (2014) ввів обов’язковий запит дозволу через UIUserNotificationSettings. iOS 10 (2016) представив UNUserNotificationCenter з підтримкою розширених сповіщень. iOS 12 (2018) додав тимчасові сповіщення та груповані сповіщення. iOS 15 (2021) ввів режим фокусування, який може блокувати сповіщення незалежно від дозволу додатку. App Tracking Transparency (iOS 14.5) не пов’язаний зі сповіщеннями, але також вплинув на загальну культуру запитів дозволів.
На даний момент обидві платформи вимагають запиту Notification Permission під час виконання. Розробник більше не може покладатися на автоматичне включення сповіщень. Користувач повністю контролює, які додатки можуть його сповіщати. Канали сповіщень на Android та категорії сповіщень на iOS дозволяють користувачу тонко налаштовувати типи отримуваних оповіщень.
Notification Permission на Android включається через дозвіл POST_NOTIFICATIONS, оголошений у маніфесті, з наступним запитом під час виконання для Android 13+.
Для Android 13+ необхідно оголосити дозвіл POST_NOTIFICATIONS в AndroidManifest.xml. Для зворотної сумісності з Android 12 та нижче дозвіл автоматично надається системою — додаткових дій не потрібно.
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
Запит дозволу POST_NOTIFICATIONS виконується через Activity Result API. Важно перевіряти версію SDK: на Android 12 та нижче запит не потрібен, дозвіл вважається автоматично наданим.
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 та нижче — дозвіл надано автоматично
showNotification()
return
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
showNotification()
} else {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
На Android 8.0+ додаток повинен створити канал сповіщень через NotificationChannel до надсилання першого сповіщення. Канал має важливість (importance) від IMPORTANCE_NONE до IMPORTANCE_HIGH, яка визначає, чи буде сповіщення показуватися зі звуком та у вигляді банера. Якщо користувач вимкнув сповіщення для додатку, нові канали не матимуть ефекту до повторного включення в налаштуваннях. Рекомендується створювати окремі канали для різних типів оповіщень: повідомлення, реклама, системні події.
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID_MESSAGES,
"Повідомлення",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Сповіщення про нові повідомлення"
enableVibration = true
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
Notification Permission на iOS запитується через UNUserNotificationCenter. Apple рекомендує двоетапний підхід: спочатку запросити тимчасові сповіщення, потім, після демонстрації цінності, повний дозвіл.
Тимчасові сповіщення — це тихі сповіщення, які потрапляють до Центру сповіщень без звуку та банера. Вони не вимагають явної згоди користувача та дозволяють додатку показати цінність сповіщень до повного запиту. Після отримання кількох тимчасових сповіщень користувач може увімкнути повноцінні сповіщення через меню в самому сповіщенні.
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
// Тимчасовий — користувач не бачить діалог
// Сповіщення надходять без звуку в Центрі сповіщень
registerForRemoteNotifications()
}
}
Поточний статус Notification Permission на iOS можна отримати через UNUserNotificationCenter.current().getNotificationSettings. Статус .authorized, .denied, .provisional або .notDetermined дозволяє додатку вибрати правильну поведінку. Після першої відмови системний діалог повторно не показується — необхідно перенаправити користувача в Налаштування через UIApplication.openSettingsURLString. Apple також рекомендує обробляти статус .ephemeral (iOS 17+), який надає тимчасові сповіщення для певних сценаріїв.
Найкращі практики запиту Notification Permission спрямовані на підвищення конверсії схвалення та зниження відтоку користувачів. Неправильний запит може не тільки позбавити додаток можливості надсилати сповіщення, але й призвести до видалення додатку.
Найпоширеніший антипатерн — запит Notification Permission при першому запуску додатку. Користувач ще не розуміє цінності додатку і з високою ймовірністю відмовить. Оптимальний момент — після того, як користувач здійснив першу цільову дію: оформив замовлення, надіслав повідомлення, підписався на оновлення. Post-value prompt підвищує конверсію схвалення до 65-75%.
Перед системним діалогом покажіть власний екран із прикладами сповіщень, які отримуватиме користувач. Покажіть макет майбутнього сповіщення з текстом та іконкою. Якщо користувач бачить, що сповіщення будуть корисними та ненав’язливими, він з більшою ймовірністю погодиться. Приклад сповіщення на попередньому екрані — ефективний прийом, що підвищує конверсію на 35-50%.
Проактивний запит тимчасових сповіщень на iOS дозволяє доставляти сповіщення без явної згоди користувача. Якщо користувач бачить цінність у цих сповіщеннях, він може увімкнути повноцінні сповіщення через контекстне меню сповіщення. Apple рекомендує цей підхід для новинних додатків, додатків погоди та інших сервісів, де сповіщення інформаційні, а не транзакційні. За даними Apple WWDC 2024, цей підхід підвищує конверсію повного схвалення на 20-30%.
Часті запитання
Після відмови системний діалог повторно не показується. Єдиний спосіб увімкнути сповіщення — перенаправити користувача в системні налаштування через Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) на Android або UIApplication.openSettingsURLString на iOS. Покажіть екран з інструкцією та кнопкою переходу.
На Android 12 та нижче Notification Permission не потрібен — всі додатки можуть надсилати сповіщення без запиту. Однак користувач може вимкнути сповіщення в будь-який момент через системні налаштування. Починаючи з Android 13, запит під час виконання обов’язковий для targetSdkVersion 33+.
NotificationChannel — це категорія сповіщень, введена в Android 8.0. Кожен канал має назву, опис, важливість (importance) та групу. Користувач може вимикати окремі канали, не вимикаючи всі сповіщення додатку. Наприклад, канал «Нові повідомлення» та канал «Рекламні розсилки» можна налаштувати по-різному.
На Android 13+ без POST_NOTIFICATIONS будь-який виклик NotificationManager.notify буде проігноровано системою. На iOS без дозволу UNUserNotificationCenter сповіщення не доставляються. Виняток: Provisional на iOS (без звуку, тільки в Центрі сповіщень) та Android 12- (не потрібен дозвіл).
На Android використовуйте NotificationManagerCompat.areNotificationsEnabled(). На iOS викличте UNUserNotificationCenter.current().getNotificationSettings та перевірте властивість authorizationStatus. Для Android додатково перевірте важливість каналу: NotificationChannel.getImportance() не повинен бути IMPORTANCE_NONE.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також