Notification Content Extension — یک افزونه iOS است که به شما امکان میدهد رابط استاندارد اعلان push را با یک UIView سفارشی جایگزین کنید. توسعهدهنده کنترل کاملی بر نمایش محتوا به دست میآورد: تصاویر، ویدئوها، انیمیشنها، فونتهای سفارشی و عناصر تعاملی. طبق Apple Developer, 2025، Notification Content Extension از هر رابط UIKit در فضای محدود اعلان پشتیبانی میکند.
نکات اصلی
Notification Content Extension — یک app extension در iOS است که الگوی استاندارد نمایش اعلان push را با یک UIView سفارشی بازنویسی میکند. برخلاف اعلان معمولی که محتوا به عنوان، زیرعنوان و متن محدود میشود، افزونه امکان نمایش هر رابط UIKit را فراهم میکند: نقشه با مختصات، نمودار، گالری تصاویر یا فرم ورودی.
وقتی iOS یک اعلان push با categoryIdentifier مشخص دریافت میکند، سیستم بررسی میکند که آیا افزونه برای این دسته ثبت شده است یا خیر. اگر بله — سیستم افزونه را در یک فرآیند جداگانه راهاندازی میکند و محتوای اعلان را به آن منتقل میکند. افزونه رابط خود را به جای رابط استاندارد نمایش میدهد. کاربر بدون باز کردن برنامه اصلی با رابط سفارشی تعامل میکند.
مهم است که Notification Content Extension را با Notification Service Extension اشتباه نگیرید. Service Extension محتوا را قبل از نمایش اعلان پردازش میکند (دانلود پیوستها، رمزگشایی). Content Extension پس از دریافت محتوای آماده، رابط را جایگزین میکند. هر دو افزونه میتوانند به صورت هماهنگ کار کنند: Service Extension دادهها را آماده میکند، Content Extension آنها را نمایش میدهد.
| ویژگی | Content Extension | Service Extension |
|---|---|---|
| هدف | UI سفارشی اعلان | تغییر محتوا قبل از نمایش |
| زمان اجرا | تا زمانی که کاربر اعلان را میبیند | تا ۳۰ ثانیه در پسزمینه |
| رابط | UIKit UIView کامل | بدون رابط |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Notification Content Extension در یک فرآیند ایزوله با منابع محدود کار میکند. افزونه به فضای ذخیرهسازی اصلی برنامه از طریق NSUserDefaults دسترسی ندارد، به جز App Group. اندازه افزونه به ۵۰ مگابایت در حالت باز شده محدود است. زمان نمایش محتوا نیز محدود است — اگر افزونه بهروزرسانی را در زمان معقول کامل نکند، سیستم آن را میبندد.
برای ایجاد افزونه در Xcode باید یک target جدید از نوع Notification Content Extension اضافه کنید. Xcode به طور خودکار MainInterface.storyboard را با کنترلری که از UIViewController ارثبری میکند و UNNotificationContentExtension را پیادهسازی میکند ایجاد میکند.
در Xcode گزینه File → New → Target → Notification Content Extension را انتخاب کنید. نام افزونه، زبان (Swift یا Objective-C) را مشخص کنید و مطمئن شوید پروژه به همان تیم توسعهدهندگان متصل است. پس از ایجاد target، پوشهای با سه فایل ظاهر میشود: MainInterface.storyboard، Info.plist و فایل کنترلر.
در Info.plist افزونه حتماً آرایه NSExtensionAttributes با کلید UNNotificationExtensionCategory مشخص میشود. این آرایه شامل شناسههای دستهبندی اعلانهایی است که افزونه برای آنها فعال میشود. کلید اختیاری UNNotificationExtensionInitialContentSizeRatio نسبت ابعاد اولیه رابط سفارشی را برای موقعیتیابی صحیح تعیین میکند.
توصیه میشود معماری تمیزی در target-افزونه حفظ شود: پوشه جداگانه برای کنترلرها، پوشه جداگانه برای نمایشهای سفارشی. از آنجایی که افزونه یک فایل باینری جداگانه است، کد برنامه اصلی به طور مستقیم در دسترس نیست. برای به اشتراکگذاری کد، یک framework جداگانه ایجاد کنید یا از App Group برای دادهها استفاده کنید.
UNNotificationContentExtension — پروتکلی است که کنترلر در Notification Content Extension باید آن را پیادهسازی کند. تنها متد اجباری didReceive(_:with:) است که هنگام دریافت اعلان فراخوانی میشود. کنترلر اعلان و یک view controller آماده را دریافت میکند که باید با دادهها بهروزرسانی شود.
کنترلر افزونه باید از UIViewController ارثبری کند و UNNotificationContentExtension را پیادهسازی کند. Storyboard یا xib با این کنترلر مرتبط است. هنگام دریافت اعلان، متد didReceive محتوا را منتقل میکند و کنترلر نمایشهای خود را بهروزرسانی میکند.
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 بررسی کنید.
سوالات متداول
بله، از 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 درخواست بهروزرسانی دهید. بهروزرسانی کامل محتوا بدون اعلان جدید امکانپذیر نیست.
target افزونه را در Xcode انتخاب کرده و روی شبیهساز اجرا کنید. از lldb و breakpointها مانند برنامه معمولی استفاده کنید. برای تست، اعلان push را از طریق Firebase Console یا به صورت محلی از طریق Pusher ارسال کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید