Notification Content Extension — چیست، چگونه یک رابط سفارشی برای iOS ایجاد کنیم

نویسنده: IT Sectr منتشر شده: 2026-03-21 زمان مطالعه: 8 دقیقه

Notification Content Extension — یک افزونه iOS است که به شما امکان می‌دهد رابط استاندارد اعلان push را با یک UIView سفارشی جایگزین کنید. توسعه‌دهنده کنترل کاملی بر نمایش محتوا به دست می‌آورد: تصاویر، ویدئوها، انیمیشن‌ها، فونت‌های سفارشی و عناصر تعاملی. طبق Apple Developer, 2025، Notification Content Extension از هر رابط UIKit در فضای محدود اعلان پشتیبانی می‌کند.

نکات اصلی

  • Notification Content Extension — افزونه iOS برای UI سفارشی اعلان‌های push.
  • افزونه پروتکل UNNotificationContentExtension را با متد اجباری didReceive پیاده‌سازی می‌کند.
  • رابط سفارشی در Storyboard ایجاد می‌شود و می‌تواند هر کامپوننت UIKit را شامل شود.
  • حداکثر اندازه افزونه — 50 مگابایت و نباید از 12 مگابایت در حالت فشرده تجاوز کند.
  • افزونه برای اعلان‌هایی با categoryIdentifier مشخص فعال می‌شود.

Notification Content Extension چیست

Notification Content Extension — یک app extension در iOS است که الگوی استاندارد نمایش اعلان push را با یک UIView سفارشی بازنویسی می‌کند. برخلاف اعلان معمولی که محتوا به عنوان، زیرعنوان و متن محدود می‌شود، افزونه امکان نمایش هر رابط UIKit را فراهم می‌کند: نقشه با مختصات، نمودار، گالری تصاویر یا فرم ورودی.

این چگونه کار می‌کند

وقتی iOS یک اعلان push با categoryIdentifier مشخص دریافت می‌کند، سیستم بررسی می‌کند که آیا افزونه برای این دسته ثبت شده است یا خیر. اگر بله — سیستم افزونه را در یک فرآیند جداگانه راه‌اندازی می‌کند و محتوای اعلان را به آن منتقل می‌کند. افزونه رابط خود را به جای رابط استاندارد نمایش می‌دهد. کاربر بدون باز کردن برنامه اصلی با رابط سفارشی تعامل می‌کند.

تفاوت با Notification Service Extension

مهم است که Notification Content Extension را با Notification Service Extension اشتباه نگیرید. Service Extension محتوا را قبل از نمایش اعلان پردازش می‌کند (دانلود پیوست‌ها، رمزگشایی). Content Extension پس از دریافت محتوای آماده، رابط را جایگزین می‌کند. هر دو افزونه می‌توانند به صورت هماهنگ کار کنند: Service Extension داده‌ها را آماده می‌کند، Content Extension آن‌ها را نمایش می‌دهد.

ویژگیContent ExtensionService Extension
هدفUI سفارشی اعلانتغییر محتوا قبل از نمایش
زمان اجراتا زمانی که کاربر اعلان را می‌بیندتا ۳۰ ثانیه در پس‌زمینه
رابطUIKit UIView کاملبدون رابط
APIUNNotificationContentExtensionUNNotificationServiceExtension

محدودیت‌های افزونه

Notification Content Extension در یک فرآیند ایزوله با منابع محدود کار می‌کند. افزونه به فضای ذخیره‌سازی اصلی برنامه از طریق NSUserDefaults دسترسی ندارد، به جز App Group. اندازه افزونه به ۵۰ مگابایت در حالت باز شده محدود است. زمان نمایش محتوا نیز محدود است — اگر افزونه به‌روزرسانی را در زمان معقول کامل نکند، سیستم آن را می‌بندد.

ایجاد Notification Content Extension در Xcode

برای ایجاد افزونه در Xcode باید یک target جدید از نوع Notification Content Extension اضافه کنید. Xcode به طور خودکار MainInterface.storyboard را با کنترلری که از UIViewController ارث‌بری می‌کند و UNNotificationContentExtension را پیاده‌سازی می‌کند ایجاد می‌کند.

افزودن target-افزونه

در Xcode گزینه File → New → Target → Notification Content Extension را انتخاب کنید. نام افزونه، زبان (Swift یا Objective-C) را مشخص کنید و مطمئن شوید پروژه به همان تیم توسعه‌دهندگان متصل است. پس از ایجاد target، پوشه‌ای با سه فایل ظاهر می‌شود: MainInterface.storyboard، Info.plist و فایل کنترلر.

پیکربندی Info.plist

در Info.plist افزونه حتماً آرایه NSExtensionAttributes با کلید UNNotificationExtensionCategory مشخص می‌شود. این آرایه شامل شناسه‌های دسته‌بندی اعلان‌هایی است که افزونه برای آن‌ها فعال می‌شود. کلید اختیاری UNNotificationExtensionInitialContentSizeRatio نسبت ابعاد اولیه رابط سفارشی را برای موقعیت‌یابی صحیح تعیین می‌کند.

معماری پوشه‌های افزونه

توصیه می‌شود معماری تمیزی در target-افزونه حفظ شود: پوشه جداگانه برای کنترلرها، پوشه جداگانه برای نمایش‌های سفارشی. از آنجایی که افزونه یک فایل باینری جداگانه است، کد برنامه اصلی به طور مستقیم در دسترس نیست. برای به اشتراک‌گذاری کد، یک framework جداگانه ایجاد کنید یا از App Group برای داده‌ها استفاده کنید.

پیاده‌سازی پروتکل UNNotificationContentExtension

UNNotificationContentExtension — پروتکلی است که کنترلر در Notification Content Extension باید آن را پیاده‌سازی کند. تنها متد اجباری didReceive(_:with:) است که هنگام دریافت اعلان فراخوانی می‌شود. کنترلر اعلان و یک view controller آماده را دریافت می‌کند که باید با داده‌ها به‌روزرسانی شود.

پیاده‌سازی پایه کنترلر

کنترلر افزونه باید از UIViewController ارث‌بری کند و UNNotificationContentExtension را پیاده‌سازی کند. Storyboard یا xib با این کنترلر مرتبط است. هنگام دریافت اعلان، متد didReceive محتوا را منتقل می‌کند و کنترلر نمایش‌های خود را به‌روزرسانی می‌کند.

swift
import UIKit
import UserNotifications
import UserNotificationsUI

class CustomNotificationViewController: UIViewController {

    @IBOutlet var titleLabel: UILabel!
    @IBOutlet var customImageView: UIImageView!

    func didReceive(
        notification: UNNotification
    ) {
        let content = notification.request.content
        titleLabel.text = content.title
        loadAttachment(content.attachments.first)
    }

    private func loadAttachment(attachment: UNNotificationAttachment?) {
        guard let url = attachment?.URL else { return }
        if let image = UIImage(contentsOfFile: url.path) {
            customImageView.image = image
        }
    }
}

extension CustomNotificationViewController: UNNotificationContentExtension {
    func didReceive(
        notification: UNNotification
    ) {
        didReceive(notification: notification)
    }
}

مدیریت اندازه رابط

سیستم اندازه رابط سفارشی را بر اساس کلید UNNotificationExtensionInitialContentSizeRatio در Info.plist و محتوای فعلی تعیین می‌کند. توصیه می‌شود این کلید را برای حداقل اندازه اولیه روی ۰.۱ تنظیم کنید و سپس اندازه را از طریق preferredContentSize پس از بارگذاری محتوا تغییر دهید.

سفارشی‌سازی رابط و تعامل‌پذیری

Notification Content Extension آزادی کامل در ایجاد رابط می‌دهد. می‌توان از هر کامپوننت UIKit استفاده کرد: UITableView، MKMapView، WKWebView، UIStackView. با این حال باید فضای محدود اعلان را در نظر گرفت و عملکرد را بهینه کرد.

افزودن نقشه به اعلان

یکی از سناریوهای محبوب نمایش نقشه با موقعیت مکانی است. برای این کار در Storyboard افزونه یک MKMapView اضافه می‌شود و کنترلر مختصات را از محتوای اعلان منتقل می‌کند. مهم است که اضافه کردن MapKit به target افزونه فراموش نشود. هنگام استفاده از نقشه، محدودیت حافظه افزونه را در نظر بگیرید — بارگذاری کاشی‌های پیچیده ممکن است از منابع موجود فراتر رود.

انیمیشن‌ها و انتقال‌ها

Notification Content Extension از انیمیشن‌های UIView پشتیبانی می‌کند، از جمله تغییر اندازه، جابجایی و شفافیت عناصر. هنگام ورود به حالت توسعه‌یافته اعلان می‌توان انیمیشن ظاهر شدن محتوا را راه‌اندازی کرد. انیمیشن‌ها باید کوتاه باشند (تا ۰.۵ ثانیه) و با تعامل کاربر با اعلان تداخل نداشته باشند. از انیمیشن‌های بی‌نهایت خودداری کنید — آن‌ها باتری را مصرف می‌کنند و عملکرد را کاهش می‌دهند.

مدیریت لمس در رابط سفارشی

از آنجایی که افزونه یک UIViewController کامل است، می‌توانید ژست‌ها و مدیریت‌کننده‌های لمس اضافه کنید. ژست‌های UIKit (UITapGestureRecognizer, UIButton) به صورت استاندارد کار می‌کنند. برای اقداماتی که نیاز به باز کردن برنامه دارند، از delegate افزونه یا userNotificationCenter استفاده کنید. عناصر تعاملی باید به اندازه کافی بزرگ باشند تا در فضای محدود به راحتی لمس شوند — حداقل اندازه touch target طبق توصیه‌های Apple ۴۴x۴۴ پوینت است.

کار با رسانه و پیوست‌ها

محتوای رسانه‌ای — قابلیت کلیدی Notification Content Extension است. اعلان می‌تواند شامل تصاویر، GIF، صدا و ویدئو باشد که در رابط سفارشی نمایش داده می‌شوند. پیوست‌ها از طریق UNNotificationAttachment تحویل داده می‌شوند که می‌تواند هم توسط سرور از طریق payload و هم توسط Notification Service Extension پس از دانلود اضافه شود. فرمت‌های JPEG، PNG، MPEG-4 و MP3 پشتیبانی می‌شوند.

نمایش رسانه در افزونه

برای نمایش تصویر کافی است UNNotificationAttachment را از محتوای اعلان دریافت کرده و از URL محلی بارگذاری کنید. مهم است به خاطر داشته باشید که افزونه فقط به فایل‌های محلی دسترسی دارد — منابع راه دور باید قبلاً توسط Service Extension دانلود شده باشند. حداکثر اندازه پیوست — ۵۰ مگابایت در iOS 15+، محدودیت با هر به‌روزرسانی بعدی افزایش می‌یابد. برای پشتیبانی از چندین تصویر از UNNotificationAttachment با شناسه‌های مختلف استفاده کنید و آن‌ها را از طریق UIPageViewController نمایش دهید.

بارگذاری و نمایش تصاویر

برای نمایش تصویر در رابط سفارشی، افزونه UNNotificationAttachment را از محتوای اعلان دریافت کرده و از URL محلی بارگذاری می‌کند. پیوست باید قبلاً توسط Notification Service Extension دانلود شده باشد — Content Extension به شبکه دسترسی ندارد. حداکثر اندازه پیوست رسانه‌ای — ۵۰ مگابایت در iOS 15+، در نسخه‌های قبلی محدودیت ۱۰ مگابایت بود. افزونه باید عدم وجود پیوست را به درستی مدیریت کرده و رابط جایگزین نمایش دهد. برای بارگذاری اولیه تصاویر با وضوح پایین از نسخه‌های بندانگشتی استفاده کنید که توسط Service Extension قبل از پیوست ایجاد شده‌اند.

پخش ویدئو در اعلان

iOS از پخش ویدئو در Notification Content Extension از طریق AVPlayerLayer پشتیبانی می‌کند. افزونه می‌تواند یک پخش‌کننده ویدئو با دکمه‌های کنترل مستقیماً در اعلان نمایش دهد. این به ویژه برای برنامه‌های نظارت تصویری، استریمینگ یا پیش‌نمایش محتوا مفید است. پخش خودکار بدون صدا مجاز است به شرطی که کاربر در این اعلان انتظار محتوای رسانه‌ای داشته باشد. هنگام پیاده‌سازی پخش‌کننده ویدئو، عناصر کنترل را اضافه کنید: play/pause، نوار پیشرفت و دکمه بستن. مطمئن شوید ویدئو به صورت خودکار با صدا شروع نمی‌شود — این توصیه‌های Apple برای تجربه کاربری را نقض می‌کند. برای نمایش اسلاید از چندین تصویر از انتقال متحرک بین آن‌ها از طریق UIView.transition با گزینه انتقال ورق زدن صفحه استفاده کنید.

بهینه‌سازی عملکرد افزونه

Notification Content Extension در محیط محدودی با محدودیت حافظه حدود ۵۰ مگابایت کار می‌کند. برای بهینه‌سازی عملکرد از بارگذاری تنبل تصاویر استفاده کنید، از محاسبات سنگین در thread اصلی خودداری کنید و از Auto Layout با محدودیت‌های ساده استفاده کنید. عملیات سنگین مانند پردازش تصاویر یا تجزیه داده‌ها را در صف‌های پس‌زمینه انجام دهید (DispatchQueue.global). در صورت تجاوز از محدودیت حافظه، سیستم افزونه را می‌بندد و کاربر اعلان استاندارد را مشاهده می‌کند. توصیه می‌شود افزونه را از طریق Instruments (Allocations و Time Profiler) قبل از انتشار پروفایل کنید و همچنین مصرف حافظه را در دستگاه‌های واقعی با نسخه‌های مختلف iOS بررسی کنید.

سوالات متداول

آیا می‌توان از SwiftUI در Notification Content Extension استفاده کرد؟

بله، از iOS 16 به بعد Notification Content Extension از SwiftUI از طریق UIHostingController پشتیبانی می‌کند. با این حال، UIKit به دلیل پشتیبانی محدود SwiftUI در افزونه‌ها، انتخاب پایدارتری برای رابط‌های پیچیده باقی می‌ماند.

چرا افزونه برای اعلان من فعال نمی‌شود؟

بررسی کنید که categoryIdentifier در payload اعلان با UNNotificationExtensionCategory در Info.plist افزونه مطابقت دارد. همچنین مطمئن شوید افزونه به target اصلی برنامه اضافه شده و به درستی امضا شده است.

چگونه داده‌ها را از برنامه اصلی به افزونه منتقل کنیم؟

از App Group استفاده کنید — فضای ذخیره‌سازی مشترک (UserDefaults suite) یا کانتینر فایل. برنامه اصلی و افزونه باید در یک گروه توسعه‌دهندگان باشند و قابلیت App Groups فعال شده باشد.

چگونه محتوای افزونه را بدون اعلان جدید به‌روزرسانی کنیم؟

برای کنترل رسانه از متد didReceive(_:with:) با UNNotificationContentExtensionMediaPlayPauseButtonType استفاده کنید یا از طریق delegate درخواست به‌روزرسانی دهید. به‌روزرسانی کامل محتوا بدون اعلان جدید امکان‌پذیر نیست.

چگونه Notification Content Extension را دیباگ کنیم؟

target افزونه را در Xcode انتخاب کرده و روی شبیه‌ساز اجرا کنید. از lldb و breakpointها مانند برنامه معمولی استفاده کنید. برای تست، اعلان push را از طریق Firebase Console یا به صورت محلی از طریق Pusher ارسال کنید.

خلاصه

  • Notification Content Extension — افزونه iOS برای نمایش سفارشی اعلان‌های push.
  • افزونه UNNotificationContentExtension را پیاده‌سازی کرده و رابط UIKit کامل ارائه می‌دهد.
  • برای اعلان‌هایی با categoryIdentifier مطابق فعال می‌شود.
  • از هر کامپوننت UI پشتیبانی می‌کند: نقشه‌ها، تصاویر، ویدئوها، انیمیشن‌ها.
  • در فرآیند ایزوله با دسترسی از طریق App Group کار می‌کند.
  • محدودیت اندازه — ۵۰ مگابایت افزونه باز شده.
  • برای محتوای رسانه‌ای از UNNotificationAttachment آماده‌شده توسط Service Extension استفاده کنید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید