Notification Content Extension — الجوهر، واجهة المستخدم المخصصة والإعداد في iOS

المؤلف: IT Sectr نُشر: 2026-06-15 وقت القراءة: 9 دق

Notification Content Extension «هو نوع من امتدادات iOS الذي يستبدل القالب القياسي لإشعارات الدفع بواجهة مستخدم مخصصة بالكامل. يحصل المطور على القدرة على عرض الصور ومشغل الصوت وأزرار الإجراءات وأشرطة التقدم والرسوم المتحركة المخصصة داخل الإشعار، مما يوسع البانر القياسي إلى تطبيق مصغر كامل. وفقاً لبيانات WWDC 2025، يستخدم الامتداد UNNotificationContentExtension ويدعم حتى 4 مرفقات وسائط في إشعار واحد، بالإضافة إلى معالجة الإجراءات التفاعلية عبر UNNotificationAction."

«الرئيسي»

  • Notification Content Extension «ينشئ واجهة مخصصة لإشعارات الدفع بدلاً من القالب النظامي القياسي»
  • «تعتمد البنية على بروتوكول» UNNotificationContentExtension «مع طرق» didReceive(_:with:) «و» didReceive(_:withCompletionHandler:)
  • «يمكن للامتداد عرض» «مرفقات وسائط» «— الصور والصوت والفيديو — مباشرة داخل الإشعار دون فتح التطبيق»
  • «الإشعارات التفاعلية» «تدعم إجراءات مخصصة مع ردود فعل وإدخال نصي»
  • «حجم الواجهة محدود — أقصى ارتفاع للإشعار المخصص» «320 نقطة» «على iPhone و 352 على iPad»

«ما هو Notification Content Extension»

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 «الخاص به غير متوفرة بسبب عزل العمليات.»

swift
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

UNNotificationContentExtension «— البروتوكول الرئيسي الذي يحدد دورة حياة الإشعار المخصص. يوفر البروتوكول طرقاً لتلقي المحتوى ومعالجة الإجراءات وإدارة الواجهة.»

«طريقة» didReceive:with:

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 محلي بعد اكتمال التنزيل بواسطة النظام. ومع ذلك، إذا لم يتم تحميل المرفق في الوقت المناسب (على سبيل المثال، بسبب ضعف الاتصال)، يمكن للامتداد عرض عنصر نائب أو نص بديل.»

«العمل مع موارد» security-scoped

«كل» UNNotificationAttachment «يوفر» security-scoped URL «يجب على الامتداد الوصول إليه عبر» startAccessingSecurityScopedResource() «وتحريره عبر» stopAccessingSecurityScopedResource(). «يجب استدعاء هذه الطرق بشكل زوجي — وإلا لن يتم تحرير المورد وسيؤدي إلى تسرب حقوق الوصول.»

swift
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.

swift
let category = UNNotificationCategory(
    identifier: "message",
    actions: [
        UNTextInputNotificationAction(
            identifier: "reply",
            title: "Reply",
            options: .authenticationRequired
        ),
        UNNotificationAction(
            identifier: "mark_read",
            title: "Mark Read",
            options: .foreground
        )
    ],
    intentIdentifiers: []
)

«الأسئلة المتكررة»

«ما الفرق بين» Notification Content Extension «و» Service Extension?

Content Extension «مسؤول عن العرض المرئي للإشعار، بينما» Service Extension «مسؤول عن تغيير المحتوى قبل العرض. يعمل» Content Extension «بعد» Service Extension «ولا يمكنه تغيير حمولة الإشعار.»

«ما هي لغات البرمجة المدعومة؟»

Swift «و» Objective-C «لـ» UIKit. «منذ iOS 16، يتم أيضاً دعم» SwiftUI «لإنشاء واجهة الإشعار عبر» NotificationContentView «مع معدّلات الحجم والتكوين.»

«هل يمكن استخدام» SwiftUI «في» Notification Content Extension?

«نعم، منذ iOS 16 يمكن للامتداد استخدام» SwiftUI «عبر» UIHostingController. «ومع ذلك، تظل جميع اختصاصات» UIKit «— الحجم والقيود والموارد» security-scoped «— سارية ويتم تطبيقها على محتوى» SwiftUI.

«كم عدد مرفقات الوسائط التي يمكن إرفاقها بإشعار واحد؟»

«حتى» «4 مرفقات» «لإشعار واحد. كل مرفق بحجم يصل إلى 50 ميجابايت. التنسيقات المدعومة: الصور (»JPEG«،» PNG«،» HEIF)، «الصوت (»MP3«،» AAC) «والفيديو (»MPEG-4«،» H.264).

«كيفية نقل البيانات من الامتداد إلى التطبيق الرئيسي؟»

«عبر» App Group «— دليل مشترك على القرص.» UserDefaults «مع لاحقة» app group «يعمل أيضاً. الاستدعاءات المباشرة لواجهة برمجة التطبيقات للتطبيق الرئيسي غير متوفرة بسبب عزل عمليات الامتداد.»

«الخلاصة»

  • Notification Content Extension «يستبدل الواجهة القياسية للإشعار بواجهة مخصصة مع أي عناصر مرئية»
  • «تستخدم البنية بروتوكول» UNNotificationContentExtension «مع طرق» didReceive «لتحديث الواجهة»
  • UNNotificationAttachment «يوفر مرفقات الوسائط مع تحميل تلقائي في الخلفية ووصول» security-scoped
  • «تدعم الإجراءات التفاعلية الإدخال النصي والعمليات التدميرية عبر» UNNotificationAction
  • «أقصى ارتفاع للواجهة —» «320 نقطة» «على iPhone، للتكيف مع المحتوى يُوصى باستخدام» UIScrollView
  • «تبادل البيانات مع التطبيق الرئيسي — فقط عبر» App Group «والدليل المشترك على القرص»

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا