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 بهروزرسانی targetSdkVersion به 33+ را الزامی میکند.
iOS 8 (2014) درخواست اجباری مجوز را از طریق UIUserNotificationSettings معرفی کرد. iOS 10 (2016) UNUserNotificationCenter را با پشتیبانی از اعلانهای غنی معرفی کرد. iOS 12 (2018) اعلانهای موقت و اعلانهای گروهی را اضافه کرد. iOS 15 (2021) حالت Focus را معرفی کرد که میتواند مستقل از مجوز برنامه، اعلانها را مسدود کند. شفافیت ردیابی برنامه (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 در اولین راهاندازی برنامه است. کاربر هنوز ارزش برنامه را درک نکرده و با احتمال بالایی رد میکند. لحظه optimal — پس از انجام اولین اقدام هدفمند توسط کاربر: ثبت سفارش، ارسال پیام، اشتراک در بهروزرسانیها. درخواست پس از ارزش نرخ تبدیل رضایت را به 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید