Notification Category (فئة الإشعارات) هي آلية في iOS لتجميع الإشعارات الفورية حسب النوع وإرفاق إجراءات مخصصة بها. تحدد الفئة الأزرار التي تظهر عند استخدام 3D Touch أو الضغط المطول على الإشعار، وكذلك كيفية معالجة النظام للإشعارات الواردة من هذا النوع. وفقًا لوثائق مطوري Apple، يتم تسجيل UNNotificationCategory في UNUserNotificationCenter وربطه بالإشعار عبر حقل category في حمولة APNS.
الوجبات الرئيسية
Notification Category هي ميزة في iOS (منذ الإصدار 8.0) تتيح للمطورين تصنيف الإشعارات الفورية وإضافة إجراءات تفاعلية إليها. عندما يتلقى المستخدم إشعارًا ويضغط بقوة (3D Touch) أو يقوم بالضغط المطول، تظهر أزرار محددة بواسطة الفئة. هذا يجعل الإشعارات تفاعلية ويسمح للمستخدمين باتخاذ إجراء دون فتح التطبيق.
يتم تسجيل فئة باستخدام كائن UNNotificationCategory، الذي يحتوي على معرّف ومصفوفة من الإجراءات ومعلمات عرض اختيارية. يستخدم النظام معرّف الفئة من حمولة APNS للعثور على الفئة المسجلة وعرض الأزرار المقابلة.
على عكس Android Notification Channel، لا تدير iOS Category الأهمية أو الصوت أو الاهتزاز. غرضها الوحيد هو توفير إمكانيات تفاعلية للإشعارات: أزرار الرد والتأكيد والإلغاء أو إدخال النص.
الفئات ليست إلزامية لعرض الإشعارات الفورية على iOS. سيظهر الإشعار على أي حال — مع أزرار إذا تم تسجيل فئة، أو بدونها. الفئات مطلوبة فقط لإضافة التفاعل إلى الإشعارات.
تتكون آلية الفئات من أربع مراحل: تسجيل الفئة على العميل، إرسال حمولة APNS مع الفئة، تعرف النظام على الفئة، ومعالجة إجراء المستخدم.
يمكن أن تكون الإجراءات في الفئة من نوعين: foreground (تفتح التطبيق) و background (تُنفذ في الخلفية). للإجراءات الخلفية، يحصل التطبيق على وقت محدود (حوالي 30 ثانية) للمعالجة في UNNotificationActionHandler.
يدعم UNNotificationCategory عدة خيارات عبر معامل options: customDismissAction — تلقي حدث عند التمرير للإزالة، allowInCarPlay — عرض الإجراءات في CarPlay، hiddenPreviewsBodyPlaceholder — نص placeholder مخصص للمعاينات المخفية.
يوفر iOS نوعين من الإجراءات لفئات الإشعارات. لكل نوع غرضه الخاص وطريقته في التفاعل مع المستخدم.
| النوع | الفئة | الوصف | مثال |
|---|---|---|---|
| إجراء بسيط | UNNotificationAction | زر بعنوان وخيارات (destructive, foreground, authenticationRequired) | «حذف», «cرض» |
| إدخال نص | UNTextInputAction | زر يفتح حقل إدخال نص مع placeholder | «رد», «تعليق» |
UNTextInputAction هي ميزة فريدة في iOS. عندما ينقر المستخدم على زر «رد»، يعرض النظام حقل نص حيث يكتب المستخدم رده. يتم تمرير النص المُدخل إلى المفوض مع معرّف الإجراء. هذا يتيح تنفيذ ردود سريعة دون فتح التطبيق.
خيارات الإجراء: options.authenticationRequired — يتطلب فتح قفل الجهاز، options.destructive — يبرز الزر باللون الأحمر (للإجراءات الخطرة)، options.foreground — يفتح التطبيق بعد النقر.
يتم تسجيل الفئات عند تشغيل التطبيق، عادةً في طريقة didFinishLaunchingWithOptions. يتم التسجيل من خلال UNUserNotificationCenter، بعد طلب إذن الإشعارات. يمكن تحديث الفئات في كل تشغيل — يتم استبدال الإصدارات القديمة بأخرى جديدة.
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "رد",
options: [.foreground],
textInputButtonTitle: "إرسال",
textInputPlaceholder: "أدخل رسالة..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "حذف",
options: [.destructive]
)
let messageCategory = UNNotificationCategory(
identifier: "message",
actions: [replyAction, deleteAction],
intentIdentifiers: [],
options: [.customDismissAction]
)
UNUserNotificationCenter.current()
.setNotificationCategories([messageCategory])
}
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
UNUserNotificationCenter.current().delegate = self
registerNotificationCategories()
return true
}
}
بعد تسجيل الفئة، أي إشعار يحتوي على category = «message» في حمولة APNS سيعرض زري «رد» و «حذف». تحدث معالجة النقرات في userNotificationCenter:didReceive response، حيث يحدد actionIdentifier أي زر تم الضغط عليه.
عندما ينقر المستخدم على زر فئة، يستدعي iOS UNUserNotificationCenterDelegate مع كائن UNNotificationResponse. يحتوي response.actionIdentifier على معرّف الزر الذي تم النقر عليه، ويحتوي response.notification.request.content.userInfo على البيانات المخصصة من الحمولة.
غالبًا ما يخلط المطورون الملمون بقنوات الإشعارات في Android بينها وبين فئات الإشعارات في iOS. على الرغم من الاسم المشابه، فإن هذه الآليات تحل مهام مختلفة وتعمل بشكل مختلف.
يمكن لكلتا المنصتين الجمع بين الآليتين: في Android، يمكن أن ينتمي الإشعار إلى قناة مع إجراءات من NotificationCompat، بينما في iOS، تُكمل الفئة القنوات، التي تسمى في iOS thread-id وتُستخدم لتجميع الإشعارات في مركز الإشعارات.
لكي يظهر الإشعار مع أزرار الفئة، يجب على الخادم تضمين مفتاح category في حمولة APNS. بدون هذا المفتاح، لن يعرف النظام أي فئة يطبقها على الإشعار.
{
"aps": {
"alert": {
"title": "رسالة جديدة",
"body": "آنا: مرحباً! كيف حالك؟"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
يجب أن يتطابق مفتاح category تمامًا مع المعرّف المسجل عبر setNotificationCategories على العميل. حالة الأحرف مهمة — «message» و «Message» تعتبران فئتين مختلفتين. إذا لم يتم العثور على الفئة، يظهر الإشعار بدون أزرار، بدون أخطاء في السجلات.
إذا أرسل الخادم إشعارًا بفئة غير مسجلة على العميل، يتجاهل iOS الفئة ويعرض الإشعار بدون أزرار. لا يتم تسجيل الخطأ، ولا يعلم التطبيق بعدم التطابق. يُوصى بمزامنة قائمة الفئات بين الخادم والعميل.
عند تصميم فئات الإشعارات في iOS، اتبع مبدأ فئة واحدة — سيناريو واحد. يجب أن تتوافق كل فئة مع نوع محدد من التفاعل: الرد على رسالة، تأكيد إجراء، رفض طلب. لا تخلط سيناريوهات مختلفة في فئة واحدة.
استخدم UNTextInputAction للسيناريوهات التي يحتاج فيها المستخدم إلى إدخال نص دون فتح التطبيق: ردود المراسلة، التعليقات، الملاحظات السريعة. تزيد إجراءات النص من التفاعل — يقوم المستخدم بإجراء ذي معنى بنقرتين بدلاً من 5+ داخل التطبيق.
للإجراءات الخطرة (حذف، حظر)، استخدم الخيار destructive. سيميز iOS هذه الأزرار باللون الأحمر، محذرًا المستخدم من عدم رجعة الإجراء. للإجراءات التي تتطلب فتح قفل الجهاز (عرض بيانات شخصية)، حدد authenticationRequired.
اختبر الفئات على أجهزة مختلفة: على iPhone مع 3D Touch، على iPhone بدون 3D Touch (الضغط المطول)، على iPad وعلى Mac. قد يختلف سلوك الفئات قليلاً عبر منصات Apple المختلفة. انتبه بشكل خاص لـ CarPlay: تظهر أزرار الفئات على شاشة السيارة ويجب تصميمها بأقل قدر من النص لسلامة السائق.
الأسئلة الشائعة
لا توجد حدود — لا يفرض iOS حدًا على عدد UNNotificationCategory. ومع ذلك، من الناحية العملية، يُوصى باستخدام ما لا يزيد عن 10–15 فئة لتجنب تعقيد المعالجة في المفوض. يمكن أن تحتوي كل فئة على ما يصل إلى 4 إجراءات (أزرار). أكثر من 4 إجراءات يتم تجاهلها من قبل النظام.
قم بتنفيذ بروتوكول UNUserNotificationCenterDelegate وطريقة didReceive. تحقق من response.actionIdentifier: UNNotificationDismissActionIdentifier — التمرير للتجاهل، UNNotificationDefaultActionIdentifier — النقر على الجسم، أو معرّف الزر المخصص الخاص بك. لأزرار إدخال النص، النص متاح عبر response.userText.
Category — تحدد الإجراءات التفاعلية (الأزرار) للإشعار. Thread-id — تجمع الإشعارات في مركز الإشعارات حسب الموضوع. يتم تحديد كلا المفتاحين في حمولة APNS. Category و thread-id غير مرتبطين: يمكن أن يكون للإشعار فئة ولكن لا يحتوي على thread-id، والعكس صحيح.
نعم، UNNotificationCategory مدعوم على macOS 10.14+ (Mojave) في التطبيقات التي تستخدم إطار UserNotifications. سلوك الفئات على macOS مشابه لـ iOS: عند النقر على الإشعار، تظهر الأزرار، وتتم المعالجة عبر UNUserNotificationCenterDelegate.
يُوصى بتسجيل الفئات في كل تشغيل للتطبيق عبر setNotificationCategories. يستبدل النظام المجموعة القديمة من الفئات بالجديدة في كل استدعاء. إذا لم تقم بالتحديث، تبقى الفئات بين عمليات التشغيل، ولكن عندما يتغير الكود، قد تسبب الفئات القديمة سلوكًا غير متوقع.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا