Notification Permission — 这是应用程序向用户发送推送通知和本地通知所需的权限。从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用户在请求后同意接收推送通知。同意转化率直接取决于请求的上下文:在第一次有价值的交互后请求权限的应用程序比在首次启动时请求的应用程序多获得40%的同意。
通知权限的演变展示了平台如何逐步限制应用程序对此通信渠道的访问。了解这种演变有助于开发人员正确处理不同版本的操作系统。
在Android 13(2022)之前,任何应用程序都可以在未经用户同意的情况下显示通知。Android 8.0(2017)引入了通知渠道,Android 12(2021)增加了自动阻止干扰性通知的功能,最终Android 13强制要求在运行时请求POST_NOTIFICATIONS权限。对于targetSdkVersion低于33的应用程序,系统会自动授予权限,但Google Play要求自2023年8月起将targetSdkVersion更新到33+。
iOS 8(2014)通过UIUserNotificationSettings引入了强制性的权限请求。iOS 10(2016)推出了支持丰富通知的UNUserNotificationCenter。iOS 12(2018)增加了临时通知和分组通知。iOS 15(2021)引入了专注模式,可以独立于应用程序权限阻止通知。应用程序跟踪透明度(iOS 14.5)与通知无关,但也影响了整体的权限请求文化。
目前,两个平台都要求在运行时请求Notification Permission。开发人员不能再依赖自动启用通知。用户完全控制哪些应用程序可以通知他们。Android上的通知渠道和iOS上的通知类别允许用户精确调整接收的通知类型。
Android上的Notification Permission通过在清单中声明的POST_NOTIFICATIONS权限实现,对于Android 13+需要运行时请求。
对于Android 13+,您需要在AndroidManifest.xml中声明POST_NOTIFICATIONS权限。为了向后兼容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)
}
iOS上的Notification Permission通过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()
}
}
iOS上Notification Permission的当前状态可以通过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%。
常见问题
拒绝后,系统对话框不再显示。启用通知的唯一方法是将用户重定向到系统设置:在Android上通过Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS),在iOS上通过UIApplication.openSettingsURLString。显示带有说明和导航按钮的屏幕。
在Android 12及更低版本上,不需要Notification Permission——所有应用程序都可以在未请求的情况下发送通知。但是,用户可以随时通过系统设置禁用通知。从Android 13开始,对于targetSdkVersion 33+,运行时请求是强制性的。
NotificationChannel——是在Android 8.0中引入的通知类别。每个渠道都有名称、描述、重要性(importance)和组。用户可以禁用单个渠道而无需禁用应用程序的所有通知。例如,“新消息”渠道和“广告简报”渠道可以不同地配置。
在Android 13+上,如果没有POST_NOTIFICATIONS,任何对NotificationManager.notify的调用都将被系统忽略。在iOS上,如果没有UNUserNotificationCenter的权限,通知将无法送达。例外情况:iOS上的Provisional(无声音,仅在通知中心)和Android 12-(不需要权限)。
在Android上使用NotificationManagerCompat.areNotificationsEnabled()。在iOS上调用UNUserNotificationCenter.current().getNotificationSettings并检查authorizationStatus属性。对于Android,还要检查渠道的重要性:NotificationChannel.getImportance()不应是IMPORTANCE_NONE。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。