Notification Content Extension «هو نوع من امتدادات iOS الذي يستبدل القالب القياسي لإشعارات الدفع بواجهة مستخدم مخصصة بالكامل. يحصل المطور على القدرة على عرض الصور ومشغل الصوت وأزرار الإجراءات وأشرطة التقدم والرسوم المتحركة المخصصة داخل الإشعار، مما يوسع البانر القياسي إلى تطبيق مصغر كامل. وفقاً لبيانات WWDC 2025، يستخدم الامتداد UNNotificationContentExtension ويدعم حتى 4 مرفقات وسائط في إشعار واحد، بالإضافة إلى معالجة الإجراءات التفاعلية عبر UNNotificationAction."
«الرئيسي»
Notification Content Extension «هو امتداد تطبيق يعيد تعريف عرض إشعار الدفع على iOS. بدلاً من البانر القياسي بالعنوان ونص الرسالة والأزرار، يمكن عرض واجهة مطورة بالكامل في Interface Builder أو برمجياً عبر UIKit أو SwiftUI.»
«على عكس» Notification Service Extension «الذي يغير المحتوى قبل العرض، فإن» Content Extension «مسؤول فقط عن» «التمثيل المرئي». «يحصل الامتداد على الإشعار الجاهز بعد كل التعديلات ويقرر كيفية عرضه. هذا هو الفرق الرئيسي بين نوعي امتدادات الإشعارات.»
«يتم تنشيط الامتداد عندما يقوم المستخدم بإيماءة التوسيع — التمرير لأسفل الإشعار أو النقر عليه (حسب طراز الجهاز). يقوم iOS بتشغيل عملية الامتداد، وينشئ وحدة التحكم من nib أو storyboard المحدد ويمرر الإشعار عبر» UNNotificationContentExtension.
«تبدأ التطوير بإضافة target جديد في Xcode باستخدام قالب» Notification Content Extension. «يقوم Xcode بإنشاء ملف» MainInterface.storyboard «وفئة ترث من» UIViewController «تنفذ بروتوكول» UNNotificationContentExtension.
«أقصى ارتفاع للمنطقة المخصصة —» «320 نقطة» «على iPhone (للطرازات ذات الشاشة الكبيرة) و 352 نقطة على iPad. يتم قص المحتوى الذي يتجاوز هذه الحدود. للتكيف مع الأحجام المختلفة، يُوصى باستخدام» Auto Layout «و» UIScrollView «للمحتوى القابل للتمرير. العرض يساوي دائماً عرض الإشعار ويتغير تلقائياً عند تدوير الجهاز.»
«تحذر» Apple Human Interface Guidelines: «يجب أن تكون واجهة الإشعار موجزة وتحتوي على عنصر رئيسي واحد فقط — صورة أو مشغل أو خريطة أو نموذج إدخال سريع. العناصر التفاعلية المتعددة تثقل على المستخدم وتعقد التفاعل.»
App Group «— الآلية الوحيدة لتبادل البيانات بين الامتداد والتطبيق الرئيسي. من خلال الدليل المشترك لـ» App Group «يمكن نقل الصور المخزنة مؤقتاً والرموز المميزة والإعدادات. الاستدعاءات المباشرة لواجهة برمجة التطبيقات للتطبيق الرئيسي أو الوصول إلى» UserDefaults «الخاص به غير متوفرة بسبب عزل العمليات.»
class NotificationViewController: UIViewController {
func didReceive(
_ notification: UNNotification
) {
guard let attachment = notification
.request.content.attachments.first()
else { return }
if attachment.url.startAccessingSecurityScopedResource() {
imageView.image = UIImage(contentsOfFile:
attachment.url.path)
attachment.url.stopAccessingSecurityScopedResource()
}
}
}
UNNotificationContentExtension «— البروتوكول الرئيسي الذي يحدد دورة حياة الإشعار المخصص. يوفر البروتوكول طرقاً لتلقي المحتوى ومعالجة الإجراءات وإدارة الواجهة.»
didReceive(_:with:) «يتم استدعاؤها عند تلقي الإشعار. يحصل الامتداد على كائن» UNNotification «و» UNNotificationContentExtensionMediaPlayPauseButtonType «لإدارة مشغل الوسائط. في هذه الطريقة، يجب إعداد الواجهة — تحميل الصورة أو تهيئة المشغل أو عرض البيانات. يستدعي النظام هذه الطريقة في كل مرة يتم فيها تحديث الإشعار في الوقت الفعلي.»
«من المهم مراعاة أن الامتداد لديه» «وقت محدود» «للتنفيذ — حوالي 30 ثانية لدورة العرض الكاملة. إذا لم يتم إعداد الواجهة خلال هذا الوقت، سيعرض iOS إشعاراً نظامياً. للموارد الثقيلة — تحميل الصور من الشبكة وفك تشفير الفيديو — يُوصى باستخدام العمليات غير المتزامنة مع التخزين المؤقت المسبق عبر» App Group.
«يتضمن البروتوكول طرقاً اختيارية لأزرار التشغيل/الإيقاف المؤقت:» mediaPlay «و» mediaPause «و» mediaPlayPauseButtonType. «إذا كان الإشعار يحتوي على محتوى صوتي أو فيديو، يمكن للامتداد عرض مشغل مدمج مع عنصر تحكم نظامي. يضيف iOS تلقائياً زر التشغيل في الزاوية العلوية اليمنى من الامتداد عند إرجاع نوع الزر المناسب.»
UNNotificationAttachment «— كائن يحتوي على بيانات الوسائط المرفقة بالإشعار. تتم إضافة الصور والملفات الصوتية والفيديو في مرحلة إنشاء الإشعار على الخادم أو في» Notification Service Extension «عبر» UNNotificationAttachment.
«للصور:» JPEG «و» PNG «و» GIF «و» HEIF. «للصوت:» MP3 «و» AAC «و» ALAC «و» WAV. «للفيديو:» MPEG-4 «و» H.264 «و» HEVC. «الحد الأقصى لحجم كل مرفق — 50 ميجابايت، حتى 4 مرفقات لكل إشعار. يقوم النظام تلقائياً بتنزيل المرفقات في الخلفية قبل عرض الإشعار ويوفر للامتداد الوصول إلى عناوين URL المحلية من خلال موارد» security-scoped.
«وفقاً لـ» Apple، «لا يجب على الامتداد تنزيل الوسائط بنفسه —» UNNotificationAttachment «يحتوي بالفعل على عنوان URL محلي بعد اكتمال التنزيل بواسطة النظام. ومع ذلك، إذا لم يتم تحميل المرفق في الوقت المناسب (على سبيل المثال، بسبب ضعف الاتصال)، يمكن للامتداد عرض عنصر نائب أو نص بديل.»
«كل» UNNotificationAttachment «يوفر» security-scoped URL «يجب على الامتداد الوصول إليه عبر» startAccessingSecurityScopedResource() «وتحريره عبر» stopAccessingSecurityScopedResource(). «يجب استدعاء هذه الطرق بشكل زوجي — وإلا لن يتم تحرير المورد وسيؤدي إلى تسرب حقوق الوصول.»
let attachment = notification.request.content.attachments.first()
guard attachment.url.startAccessingSecurityScopedResource()
else { return }
defer { attachment.url.stopAccessingSecurityScopedResource() }
let data = try Data(contentsOf: attachment.url)
imageView.image = UIImage(data: data)
Notification Content Extension «يدعم الإجراءات التفاعلية المخصصة — الأزرار التي تظهر تحت محتوى الإشعار. يتم تسجيل الإجراءات عند إنشاء فئة الإشعار عبر» UNNotificationCategory «ويمكن أن تكون تدميرية أو نصية أو خلفية.»
UNNotificationAction «— إجراء بسيط بعنوان وعلامة تدمير اختيارية.» UNTextInputNotificationAction «— إجراء مع حقل إدخال نص، مثلاً للرد السريع على رسالة. يدعم كلا النوعين خيار» UNNotificationActionOptions.authenticationRequired «— شرط فتح قفل الجهاز قبل التنفيذ.»
«يتلقى الامتداد الإجراء المحدد عبر طريقة» didReceive(_:withCompletionHandler:) «حيث يتم تمرير كائن» UNNotificationResponse «مع معرف الإجراء والنص الاختياري. يمكن للامتداد معالجة الرد بنفسه أو تمريره إلى التطبيق الرئيسي عبر الحاوية المشتركة» App Group.
let category = UNNotificationCategory(
identifier: "message",
actions: [
UNTextInputNotificationAction(
identifier: "reply",
title: "Reply",
options: .authenticationRequired
),
UNNotificationAction(
identifier: "mark_read",
title: "Mark Read",
options: .foreground
)
],
intentIdentifiers: []
)
«الأسئلة المتكررة»
Content Extension «مسؤول عن العرض المرئي للإشعار، بينما» Service Extension «مسؤول عن تغيير المحتوى قبل العرض. يعمل» Content Extension «بعد» Service Extension «ولا يمكنه تغيير حمولة الإشعار.»
Swift «و» Objective-C «لـ» UIKit. «منذ iOS 16، يتم أيضاً دعم» SwiftUI «لإنشاء واجهة الإشعار عبر» NotificationContentView «مع معدّلات الحجم والتكوين.»
«نعم، منذ iOS 16 يمكن للامتداد استخدام» SwiftUI «عبر» UIHostingController. «ومع ذلك، تظل جميع اختصاصات» UIKit «— الحجم والقيود والموارد» security-scoped «— سارية ويتم تطبيقها على محتوى» SwiftUI.
«حتى» «4 مرفقات» «لإشعار واحد. كل مرفق بحجم يصل إلى 50 ميجابايت. التنسيقات المدعومة: الصور (»JPEG«،» PNG«،» HEIF)، «الصوت (»MP3«،» AAC) «والفيديو (»MPEG-4«،» H.264).
«عبر» App Group «— دليل مشترك على القرص.» UserDefaults «مع لاحقة» app group «يعمل أيضاً. الاستدعاءات المباشرة لواجهة برمجة التطبيقات للتطبيق الرئيسي غير متوفرة بسبب عزل عمليات الامتداد.»
«الخلاصة»
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا