Notification Permission — това е разрешението, от което приложението се нуждае, за да изпраща push известия и локални известия до потребителя. Започвайки от Android 13 и iOS 12, приложенията са задължени да искат това разрешение по време на изпълнение чрез системен диалог. Според Android Developers, 2024, без изричното съгласие на потребителя, приложението не може да показва известия на устройства с Android 13 и по-нови.
Основни неща
Notification Permission — това е системно разрешение, което регулира способността на приложението да изпраща известия до потребителя. До Android 13 всички приложения можеха да показват известия без искане — достатъчно беше да декларират разрешението в манифеста. Но с нарастването на спама и натрапчивите известия, Google въведе задължително искане по време на изпълнение, подобно на iOS.
На iOS разрешението за известия беше задължително от iOS 8, а от iOS 12 нататък се появиха временни (provisional) известия — тихи известия, които се доставят без звук и се показват в Центъра за известия без изрично искане. Временните известия позволяват на разработчика да покаже на потребителя стойността на известията, преди да поиска пълно разрешение.
Според 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) въведе Focus Mode, който може да блокира известия независимо от разрешението на приложението. Прозрачност на проследяване на приложения (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
// Provisional — потребителят не вижда диалога
// Известията идват без звук в Центъра за известия
registerForRemoteNotifications()
}
}
Текущият статус на Notification Permission на iOS може да се получи чрез UNUserNotificationCenter.current().getNotificationSettings. Статусите .authorized, .denied, .provisional или .notDetermined позволяват на приложението да избере правилното поведение. След първия отказ системният диалог не се показва отново — трябва да пренасочите потребителя към Настройки чрез UIApplication.openSettingsURLString. Apple също препоръчва обработка на статуса .ephemeral (iOS 17+), който предоставя временни известия за определени сценарии.
Най-добрите практики за искане на Notification Permission имат за цел увеличаване на степента на конверсия на съгласие и намаляване на загубата на потребители. Неправилното искане може не само да лиши приложението от възможността да изпраща известия, но и да доведе до премахване на приложението.
Най-честият анти-модел — искане на Notification Permission при първото стартиране на приложението. Потребителят все още не разбира стойността на приложението и с голяма вероятност ще откаже. Оптималният момент — след като потребителят извърши първото целево действие: направи поръчка, изпрати съобщение, абонира се за актуализации. Искането след стойност повишава степента на конверсия на съгласие до 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също