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 — тихие уведомления, которые доставляются без звука и отображаются в Notification Center без явного запроса. 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 с поддержкой rich notifications. iOS 12 (2018) добавила provisional notifications и grouped notifications. iOS 15 (2021) ввела Focus Mode, который может блокировать уведомления независимо от разрешения приложения. App Tracking Transparency (iOS 14.5) не связан с уведомлениями, но также повлиял на общую культуру запросов разрешений.
На текущий момент обе платформы требуют рантайм-запроса Notification Permission. Разработчик больше не может полагаться на автоматическое включение уведомлений. Пользователь полностью контролирует, какие приложения могут его оповещать. Notification channels на 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 рекомендует двухэтапный подход: сначала запросить provisional notifications, затем, после демонстрации ценности, полноценное разрешение.
Provisional notifications — это тихие уведомления, которые попадают в Notification Center без звука и баннера. Они не требуют явного согласия пользователя и позволяют приложению показать ценность уведомлений до полноценного запроса. После получения нескольких provisional-уведомлений пользователь может включить полноценные уведомления через меню в самом уведомлении.
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 — пользователь не видит диалог
// Уведомления приходят без звука в Notification Center
registerForRemoteNotifications()
}
}
Текущий статус Notification Permission на iOS можно получить через UNUserNotificationCenter.current().getNotificationSettings. Статус .authorized, .denied, .provisional или .notDetermined позволяет приложению выбрать правильное поведение. После первого отказа системный диалог повторно не показывается — необходимо перенаправить пользователя в Settings через UIApplication.openSettingsURLString. Apple также рекомендует обрабатывать статус .ephemeral (iOS 17+), который предоставляет временные уведомления для определённых сценариев.
Лучшие практики запроса Notification Permission направлены на повышение конверсии одобрения и снижение оттока пользователей. Неправильный запрос может не только лишить приложение возможности отправлять уведомления, но и привести к удалению приложения.
Самый распространённый антипаттерн — запрос Notification Permission при первом запуске приложения. Пользователь ещё не понимает ценность приложения и с высокой вероятностью откажет. Оптимальный момент — после того как пользователь совершил первое целевое действие: оформил заказ, отправил сообщение, подписался на обновления. Post-value prompt повышает конверсию одобрения до 65-75%.
Перед системным диалогом покажите собственный экран с примерами уведомлений, которые будет получать пользователь. Покажите макет будущего уведомления с текстом и иконкой. Если пользователь видит, что уведомления будут полезными и ненавязчивыми, он с большей вероятностью согласится. Пример уведомления на предварительном экране — эффективный приём, повышающий конверсию на 35-50%.
Проактивный запрос Provisional Notifications на 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 (без звука, только в Notification Center) и Android 12- (не требуется разрешение).
На Android используйте NotificationManagerCompat.areNotificationsEnabled(). На iOS вызовите UNUserNotificationCenter.current().getNotificationSettings и проверьте свойство authorizationStatus. Для Android дополнительно проверьте важность канала: NotificationChannel.getImportance() не должен быть IMPORTANCE_NONE.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также