Rich Notification هو تنسيق محسّن للإشعارات الفورية في iOS يتضمن المرفقات الوسائط والأزرار التفاعلية والواجهات المخصصة لتحسين تجربة المستخدم. على عكس الإشعارات النصية القياسية، يمكن لـ Rich Notification عرض الصور والفيديو والصوت مباشرة في الشعار أو على شاشة القفل. وفقًا لـ Apple Developer Documentation, 2026، يدعم UNNotificationAttachment ما يصل إلى 10 ملفات في إشعار واحد ويقوم بتغيير حجمها تلقائيًا للعرض الأمثل على جميع الأجهزة.
أهم النقاط
Rich Notification هو إشعار فوري في iOS لا يحتوي على نص فقط، بل يشمل أيضًا المرفقات الوسائط والعناصر التفاعلية وواجهة مخصصة. يعكس مصطلح «rich» (الغني) القدرة على تضمين الصور والفيديو والصوت وأزرار الإجراءات وإدخال النص في الإشعار، مما يحول التنبيه البسيط إلى عنصر تفاعلي متكامل.
قدمت Apple دعم Rich Notification في iOS 10 مع إطار UserNotifications. قبل ذلك، كانت الإشعارات الفورية تحتوي فقط على نص وصوت وشارة. قدم iOS 10 UNNotificationServiceExtension وUNNotificationContentExtension، مما فتح إمكانية تعديل المحتوى وإنشاء واجهات مخصصة. أضافت الإصدارات الأحدث دعم SwiftUI في Content Extension والصور المتحركة GIF وتحسين تغيير حجم الوسائط.
يعمل Rich Notification على زيادة تفاعل المستخدم بشكل كبير. تظهر دراسات Apple أن الإشعارات التي تحتوي على صور تحصل على تفاعلات أكثر بنسبة 30–40% مقارنة بالإشعارات النصية فقط. تسمح صورة المنتج أو معاينة الفيديو أو زر الرد السريع للمستخدم باتخاذ قرار مباشرة من الإشعار دون فتح التطبيق. وهذا يختصر المسار إلى الإجراء المستهدف ويحسن تجربة المستخدم.
UNNotificationAttachment يدعم ثلاث فئات من الوسائط: الصور والفيديو والصوت. لكل نوع حدوده الخاصة من حيث التنسيق والحجم والمدة. يقوم النظام تلقائيًا بتغيير حجم الصور لتناسب حجم الإشعار ويحدد مدة الفيديو بـ 30 ثانية لتحسين الأداء.
| نوع الوسائط | التنسيقات المدعومة | الحد الأقصى للحجم |
|---|---|---|
| الصور | JPEG، PNG، GIF، TIFF | 10 ميغابايت لكل ملف |
| الفيديو | MPEG، MP4، MOV | 10 ميغابايت، حتى 30 ثانية |
| الصوت | MP3، AAC، WAV، CAF | 10 ميغابايت |
يتم قص الصور وتغيير حجمها تلقائيًا بواسطة النظام لعرضها في طرق عرض الإشعارات المضغوطة والموسعة. الصور المتحركة GIF مدعومة بدءًا من iOS 12 ويتم تشغيلها تلقائيًا عند عرض الإشعار. الحجم الموصى به للصورة هو 1024 × 1024 بكسل، مما يضمن عرضًا واضحًا على جميع الأجهزة بما في ذلك iPad بشاشته الكبيرة.
يتم تشغيل الفيديو في Rich Notification بدون صوت افتراضيًا — يمكن للمستخدم تشغيل الصوت عبر زر المشغل. المدة القصوى للفيديو هي 30 ثانية، وبعدها يتوقف التشغيل. يمكن استخدام مرفقات الصوت للرسائل الصوتية أو معاينات الصوت ويتم تشغيلها عند النقر على الإشعار في العرض الموسع.
الإجراءات التفاعلية تسمح للمستخدم بتنفيذ العمليات مباشرة من الإشعار دون فتح التطبيق. يتم تسجيل الإجراءات عبر UNNotificationCategory وUNNotificationAction عند تشغيل التطبيق. يمكن أن يكون كل إجراء في الخلفية (بدون فتح التطبيق) أو في المقدمة (يفتح التطبيق لإكمال العملية).
يمثل UNNotificationAction زرًا بعنوان ومعدِّلات اختيارية مثل requiresAuthentication (يتطلب Face ID/Touch ID) أو destructive (يظهر باللون الأحمر). UNTextInputNotificationAction يوسع هذه الإمكانية بإضافة حقل إدخال نص — مثالي للردود السريعة على الرسائل أو التعليقات. تظهر الإجراءات عند الضغط المطول على الإشعار أو التمرير لأسفل.
تربط فئات الإشعارات نوع المحتوى بمجموعة من الإجراءات المتاحة. عملية التسجيل تتم في AppDelegate عند تشغيل التطبيق عبر UNUserNotificationCenter.current().setNotificationCategories. يتم تحديد الفئة على الخادم في حقل category في حمولة JSON، ويطبق النظام تلقائيًا مجموعة الإجراءات المقابلة على الإشعار.
عندما ينقر المستخدم على زر أو يرسل نصًا، يقوم النظام باستدعاء المفوض UNUserNotificationCenterDelegate بطريقة didReceive response. UNNotificationResponse يحتوي على معرف الإجراء والنص المُدخل (لـ UNTextInputNotificationAction). بناءً على هذه المعلومات، ينفذ التطبيق منطق الأعمال المقابل: يرسل رسالة أو يؤكد إجراءً أو يفتح شاشة معينة.
دعنا نستعرض دورة إنشاء Rich Notification الكاملة: من تسجيل الفئات في AppDelegate إلى المعالجة في Service Extension والعرض. AppDelegate يسجل الفئة بالأزرار، ويرسل الخادم إشعارًا بعنوان URL للصورة، ويقوم Service Extension بتنزيل الوسائط، ويعرض Content Extension واجهة مخصصة بالأزرار.
// AppDelegate — تسجيل الفئات والإجراءات
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "رد",
options: [.authenticationRequired])
let likeAction = UNNotificationAction(
identifier: "like",
title: "إعجاب",
options: [])
let category = UNNotificationCategory(
identifier: "social_post",
actions: [replyAction, likeAction],
intentIdentifiers: [],
options: [])
UNUserNotificationCenter.current()
.setNotificationCategories([category])
return true
}
بعد استلام إشعار فوري بالفئة «social_post» وعنوان URL للصورة في حقل مخصص، يتم تنشيط Service Extension. يقوم الامتداد بتنزيل الصورة من الشبكة، وينشئ UNNotificationAttachment بمعرف فريد ويضيفه إلى المحتوى. من المهم التحقق من حجم الملف الذي تم تنزيله — إذا تجاوز 10 ميغابايت، لن يتم إنشاء المرفق وسيعرض النظام الإشعار بدون وسائط.
class NotificationService: UNNotificationServiceExtension {
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler:
@escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as! UNMutableNotificationContent)
guard let urlString = content.userInfo["media-url"]
as? String,
let url = URL(string: urlString)
else { contentHandler(request.content); return }
URLSession.shared.downloadTask(with: url) {
location, _, _ in
guard let location = location else {
contentHandler(content); return }
let attachment = try! UNNotificationAttachment(
identifier: "media", url: location,
options: [UNNotificationAttachmentOptionsTypeHintKey:
"jpg"])
content.attachments = [attachment]
contentHandler(content)
}.resume()
}
}
لاختبار Rich Notification بدون خادم، استخدم محاكي iOS وأرسل الإشعارات عبر الطرفية باستخدام xcrun simctl push. في الحمولة، تأكد من تحديد mutable-content: 1 لتفعيل Service Extension والفئة لعرض الإجراءات. يقوم الأمر بتشغيل إشعار من ملف JSON مباشرة على المحاكي المحدد، مما يسمح بالتكرار السريع دون إعداد بنية تحتية للخادم.
UNNotificationContentExtension يسمح باستبدال واجهة الإشعار القياسية بالكامل بعرض UIKit أو SwiftUI مخصص. يتم تنشيط الامتداد عندما يوسع المستخدم الإشعار (الضغط بقوة أو التمرير لأسفل) ويمكن أن يحتوي على أزرار ومنزلقات ورسوم متحركة وأي مكونات واجهة مستخدم أخرى. يتكيف حجم الواجهة مع المحتوى باستخدام Auto Layout.
يعتمد Content Extension على storyboard مع وحدة تحكم عرض ترث من UIViewController. SwiftUI View يتم دمجها عبر UIHostingController بدءًا من iOS 16، مما يسمح باستخدام أساليب حديثة لبناء الواجهة. للتوافق مع iOS 14–15، يُوصى باستخدام UIKit مع ملفات xib. تستقبل الواجهة المحتوى المعدل من Service Extension عبر UNNotificationContent.
ينفذ Content Extension بروتوكول UNNotificationContentExtension بطريقة didReceive response. UNNotificationResponse يحتوي على معلومات حول الزر المضغوط أو النص المُدخل. يمكن للامتداد تحديث الواجهة دون إغلاق الإشعار أو استدعاء معالج الإكمال لإغلاقه. يتيح ذلك إنشاء سيناريوهات تفاعل سريع، مثل «إعجاب» مع ردود فعل بصرية مباشرة في الإشعار.
توصي Apple بجعل Content Extension موجزًا ووظيفيًا، وتجنب العناصر الزائدة. الحد الأقصى لارتفاع الإشعار الموسع حوالي 400 نقطة، وبعدها يتم تمرير المحتوى. استخدم خطوط النظام والمسافات للتوافق مع الإشعارات الأخرى. اختبر على أحجام شاشات مختلفة للتأكد من عرض الواجهة بشكل صحيح على كل من iPhone وiPad.
الأسئلة الشائعة
الحد الأقصى لحجم المرفق الوسائط الواحد هو 10 ميغابايت. عند تجاوز الحد، لا يتم إنشاء UNNotificationAttachment ويتم عرض الإشعار بدون وسائط. يُوصى بتحسين الصور إلى 1–3 ميغابايت للتحميل السريع في Service Extension.
Rich Notifications مدعومة على جميع الأجهزة التي تعمل بـ iOS 10 والإصدارات الأحدث، بما في ذلك iPhone 5s والأحدث. Content Extension بواجهة مخصصة متاح من iOS 12. SwiftUI في Content Extension — من iOS 16. في الإصدارات الأقدم، يتم عرض الإشعار بالشكل القياسي.
نعم، الصور المتحركة GIF مدعومة بدءًا من iOS 12. يتم تحميل GIF عبر UNNotificationAttachment كصورة عادية ويتم تشغيلها تلقائيًا عند عرض الإشعار. حجم GIF محدود بنفس 10 ميغابايت مثل التنسيقات الأخرى.
الحد الأقصى 4 إجراءات لكل إشعار عند تسجيل فئة. إذا تم تحديد أكثر، يعرض النظام أول 4 ويتجاهل الباقي. يُوصى باستخدام 2–3 أزرار لتجربة مستخدم مثلى — الكثير من الخيارات يثقل الواجهة.
نعم، يجب على الخادم إرسال الإشعارات عبر APNS (خدمة الإشعارات الفورية من Apple) بحمولة JSON تحتوي على عنوان URL لملف الوسائط في حقل مخصص وعلامة mutable-content: 1. يحدد الخادم أيضًا الفئة لتفعيل Content Extension والإجراءات.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا