Notification Permission هو الإذن المطلوب للتطبيق لإرسال الإشعارات الفورية والإشعارات المحلية للمستخدم. بدءاً من Android 13 و iOS 12، يجب على التطبيقات طلب هذا الإذن في وقت التشغيل عبر حوار النظام. وفقاً لـ Android Developers، 2024، بدون موافقة صريحة من المستخدم، لا يمكن للتطبيق عرض الإشعارات على الأجهزة التي تعمل بنظام Android 13 وما فوق.
الملخص
Notification Permission هو إذن نظام ينظم قدرة التطبيق على إرسال الإشعارات للمستخدم. قبل Android 13، كانت جميع التطبيقات قادرة على عرض الإشعارات بدون طلب — كان يكفي declaration الإذن في البيان. ومع ذلك، مع زيادة البريد العشوائي والإشعارات المزعجة، قدم Google طلباً إلزامياً في وقت التشغيل، مماثلاً لنظام iOS.
على iOS، كان إذن الإشعارات إلزامياً منذ iOS 8، وبدءاً من iOS 12 ظهرت الإشعارات المؤقتة — إشعارات صامتة يتم تسليمها بدون صوت وتظهر في مركز الإشعارات بدون طلب صريح. الإشعارات المؤقتة تسمح للمطور بعرض قيمة الإشعارات للمستخدم قبل طلب الإذن الكامل.
وفقاً لـ 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 يتطلب تحديث targetSdkVersion إلى 33+ منذ أغسطس 2023.
iOS 8 (2014) قدم طلب الإذن الإلزامي عبر UIUserNotificationSettings. iOS 10 (2016) قدم UNUserNotificationCenter مع دعم الإشعارات الغنية. iOS 12 (2018) أضاف الإشعارات المؤقتة والإشعارات المجمعة. iOS 15 (2021) قدم وضع التركيز، الذي يمكنه حظر الإشعارات بغض النظر عن إذن التطبيق. App Tracking Transparency (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_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
// مؤقت — المستخدم لا يرى الحوار
// تصل الإشعارات بدون صوت إلى مركز الإشعارات
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. كل قناة لها اسم ووصف ومستوى أهمية ومجموعة. يمكن للمستخدم تعطيل القنوات الفردية بدون تعطيل جميع إشعارات التطبيق. على سبيل المثال، يمكن تكوين قناة “رسائل جديدة” وقناة “النشرات الإعلانية” بشكل مختلف.
على 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. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا