Notification Permission is a permission required by an app to send push notifications and local notifications to the user. Starting with Android 13 and iOS 12, apps must request this permission at runtime through a system dialog. According to Android Developers, 2024, without explicit user consent, the app cannot display notifications on devices running Android 13 and above.
Key Takeaways
Notification Permission is a system permission that controls an app’s ability to send notifications to the user. Before Android 13, all apps could display notifications without a request — it was enough to declare the permission in the manifest. However, with the rise of spam and intrusive notifications, Google introduced a mandatory runtime request, similar to iOS.
On iOS, notification permission has been mandatory since iOS 8, and starting with iOS 12, provisional notifications appeared — silent notifications that are delivered without sound and displayed in the Notification Center without an explicit request. Provisional notifications allow developers to show users the value of notifications before requesting full permission.
According to Localytics (2024), 61% of iOS users and 55% of Android users agree to receive push notifications after a request. Approval conversion directly depends on the context of the request: apps that ask for permission after the first valuable interaction receive 40% more approvals than those that ask on the first launch.
The evolution of notification permissions shows how platforms have gradually restricted app access to this communication channel. Understanding this evolution helps developers properly handle different OS versions.
Before Android 13 (2022), any app could display notifications without user consent. Android 8.0 (2017) introduced notification channels, Android 12 (2021) added automatic blocking of intrusive notifications, and finally Android 13 made it mandatory to request POST_NOTIFICATIONS at runtime. For apps with targetSdkVersion below 33, the system automatically grants the permission, but Google Play has required updating targetSdkVersion to 33+ since August 2023.
iOS 8 (2014) introduced a mandatory permission request via UIUserNotificationSettings. iOS 10 (2016) introduced UNUserNotificationCenter with support for rich notifications. iOS 12 (2018) added provisional notifications and grouped notifications. iOS 15 (2021) introduced Focus Mode, which can block notifications regardless of app permission. App Tracking Transparency (iOS 14.5) is not related to notifications but has also influenced the overall culture of permission requests.
Currently, both platforms require a runtime Notification Permission request. Developers can no longer rely on automatic notification enablement. Users have full control over which apps can notify them. Notification channels on Android and notification categories on iOS allow users to fine-tune the types of alerts they receive.
Notification Permission on Android is enabled through the POST_NOTIFICATIONS permission declared in the manifest, followed by a runtime request for Android 13+.
For Android 13+, you must declare the POST_NOTIFICATIONS permission in AndroidManifest.xml. For backward compatibility with Android 12 and below, the permission is automatically granted by the system — no additional action is required.
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
The POST_NOTIFICATIONS permission request is performed via the Activity Result API. It is important to check the SDK version: on Android 12 and below, no request is needed — the permission is considered automatically granted.
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 and below — permission granted automatically
showNotification()
return
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
showNotification()
} else {
notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}
On Android 8.0+, the app must create a notification channel via NotificationChannel before sending the first notification. The channel has an importance level from IMPORTANCE_NONE to IMPORTANCE_HIGH, which determines whether the notification will be displayed with sound and as a banner. If the user has disabled notifications for the app, new channels will not take effect until re-enabled in settings. It is recommended to create separate channels for different types of alerts: messages, ads, system events.
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID_MESSAGES,
"Messages",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "New message notifications"
enableVibration = true
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
Notification Permission on iOS is requested through UNUserNotificationCenter. Apple recommends a two-step approach: first request provisional notifications, then, after demonstrating value, request full permission.
Provisional notifications are silent notifications that appear in the Notification Center without sound or banner. They do not require explicit user consent and allow the app to demonstrate the value of notifications before a full request. After receiving several provisional notifications, the user can enable full notifications through the menu within the notification itself.
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 — user does not see the dialog
// Notifications arrive silently in Notification Center
registerForRemoteNotifications()
}
}
The current Notification Permission status on iOS can be obtained via UNUserNotificationCenter.current().getNotificationSettings. The status .authorized, .denied, .provisional, or .notDetermined allows the app to choose the correct behavior. After the first denial, the system dialog is not shown again — you must redirect the user to Settings via UIApplication.openSettingsURLString. Apple also recommends handling the .ephemeral status (iOS 17+), which provides temporary notifications for specific scenarios.
Best practices for requesting Notification Permission aim to increase approval conversion and reduce user churn. An incorrect request can not only deprive the app of the ability to send notifications but also lead to app uninstallation.
The most common antipattern is requesting Notification Permission on the first launch of the app. The user does not yet understand the app’s value and is highly likely to deny. The optimal moment is after the user has performed the first valuable action: placed an order, sent a message, subscribed to updates. A post-value prompt increases approval conversion to 65-75%.
Before the system dialog, show your own screen with examples of notifications the user will receive. Display a mockup of a future notification with text and an icon. If the user sees that the notifications will be useful and non-intrusive, they are more likely to consent. A notification preview on the pre-permission screen is an effective technique that boosts conversion by 35-50%.
Proactively requesting Provisional Notifications on iOS allows delivering notifications without explicit user consent. If the user sees value in these notifications, they can enable full notifications through the notification’s context menu. Apple recommends this approach for news apps, weather apps, and other services where notifications are informational rather than transactional. According to Apple WWDC 2024, this approach increases full approval conversion by 20-30%.
Frequently Asked Questions
After denial, the system dialog is not shown again. The only way to enable notifications is to redirect the user to system settings via Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) on Android or UIApplication.openSettingsURLString on iOS. Show a screen with instructions and a button to proceed.
On Android 12 and below, Notification Permission is not required — all apps can send notifications without a request. However, the user can disable notifications at any time through system settings. Starting with Android 13, a runtime request is mandatory for targetSdkVersion 33+.
NotificationChannel is a notification category introduced in Android 8.0. Each channel has a name, description, importance level, and group. Users can disable individual channels without disabling all app notifications. For example, the “New Messages” channel and the “Promotional Mailings” channel can be configured differently.
On Android 13+, without POST_NOTIFICATIONS, any call to NotificationManager.notify will be ignored by the system. On iOS, without UNUserNotificationCenter permission, notifications are not delivered. Exception: Provisional on iOS (no sound, only in Notification Center) and Android 12- (permission not required).
On Android, use NotificationManagerCompat.areNotificationsEnabled(). On iOS, call UNUserNotificationCenter.current().getNotificationSettings and check the authorizationStatus property. For Android, additionally check the channel importance: NotificationChannel.getImportance() should not be IMPORTANCE_NONE.
Summary
We will develop a mobile application turnkey
IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.
Read also