Notification Category (دستهبندی اعلانها) مکانیزمی در iOS است برای گروهبندی اعلانهای فشار بر اساس نوع و اختصاص اقدامات قابل تنظیم به آنها. دستهبندی مشخص میکند که کدام دکمهها در هنگام 3D Touch یا لمس طولانی روی اعلان نمایش داده شوند، همچنین نحوه پردازش اعلانهای ورودی از این نوع توسط سیستم. بر اساس Apple Developer Documentation، UNNotificationCategory در UNUserNotificationCenter ثبت میشود و از طریق فیلد category در بار APNS به اعلان متصل میشود.
نکات اصلی
Notification Category قابلیتی در iOS (از نسخه 8.0) است که به توسعهدهنده اجازه میدهد اعلانهای فشار را طبقهبندی کرده و اقدامات تعاملی به آنها اضافه کند. وقتی کاربر اعلانی دریافت میکند و با فشار (3D Touch) یا لمس طولانی روی آن کلیک میکند، دکمههای تعریفشده توسط دستهبندی ظاهر میشوند.
دستهبندی از طریق شیء UNNotificationCategory ثبت میشود که شامل شناسه، آرایهای از اقدامات و پارامترهای اختیاری نمایش است. سیستم از شناسه دستهبندی موجود در بار APNS برای یافتن دستهبندی ثبتشده و نمایش اقدامات مربوطه استفاده میکند.
برخلاف Android Notification Channel، iOS Category اهمیت، صدا یا لرزش را مدیریت نمیکند. تنها وظیفه آن ارائه امکانات تعاملی برای اعلان است: دکمههای پاسخ، تأیید، لغو یا ورود متن.
دستهبندیها برای نمایش اعلانهای فشار در iOS اجباری نیستند. اعلان در هر صورت نمایش داده میشود — با دکمهها اگر دستهبندی ثبت شده باشد، یا بدون آنها. دستهبندیها فقط برای افزودن تعامل به اعلانها مورد نیاز هستند.
مکانیزم دستهبندیها از چهار مرحله تشکیل شده است: ثبت دستهبندی در سمت کلاینت، ارسال بار APNS با دستهبندی، تشخیص دستهبندی توسط سیستم و پردازش اقدام کاربر.
اقدامات در دستهبندی میتوانند دو نوع باشند: foreground (برنامه را باز میکنند) و background (در پسزمینه اجرا میشوند). برای اقدامات پسزمینه، برنامه زمان محدودی (حدود ۳۰ ثانیه) برای پردازش در UNNotificationActionHandler دریافت میکند.
UNNotificationCategory چندین گزینه را از طریق پارامتر options پشتیبانی میکند: customDismissAction — دریافت رویداد هنگام کشیدن اعلان، allowInCarPlay — نمایش اقدامات در CarPlay، hiddenPreviewsBodyPlaceholder — متن سفارشی برای پیشنمایشهای مخفی. تنظیم صحیح گزینهها تجربه کاربری را در دستگاههای مختلف اپل بهبود میبخشد.
iOS دو نوع اقدام برای دستهبندی اعلانها ارائه میدهد. هر نوع کاربرد و روش تعامل خاص خود را با کاربر دارد.
| نوع | کلاس | توضیح | مثال |
|---|---|---|---|
| اقدام ساده | UNNotificationAction | دکمه با عنوان و گزینهها (destructive, foreground, authenticationRequired) | «حذف»، «مشاهده» |
| ورود متن | UNTextInputAction | دکمهای که فیلد ورود متن با راهنما باز میکند | «پاسخ»، «نظر» |
UNTextInputAction — قابلیت منحصربهفرد iOS. با فشار دکمه «پاسخ»، سیستم یک فیلد متنی نمایش میدهد که کاربر پاسخ خود را در آن وارد میکند. متن وارد شده همراه با شناسه اقدام به نماینده ارسال میشود. این امکان پاسخهای سریع بدون باز کردن برنامه را فراهم میکند.
گزینههای اقدام: options.authenticationRequired — نیاز به باز کردن قفل دستگاه، options.destructive — دکمه را قرمز رنگ میکند (برای اقدامات خطرناک)، options.foreground — پس از فشار برنامه را باز میکند.
دستهبندیها هنگام راهاندازی برنامه، معمولاً در متد didFinishLaunchingWithOptions ثبت میشوند. ثبت از طریق UNUserNotificationCenter، پس از درخواست مجوز اعلانها انجام میشود. دستهبندیها را میتوان در هر راهاندازی بهروز کرد — نسخههای قدیمی با نسخههای جدید جایگزین میشوند.
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "پاسخ",
options: [.foreground],
textInputButtonTitle: "ارسال",
textInputPlaceholder: "پیام را وارد کنید..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "حذف",
options: [.destructive]
)
let messageCategory = UNNotificationCategory(
identifier: "message",
actions: [replyAction, deleteAction],
intentIdentifiers: [],
options: [.customDismissAction]
)
UNUserNotificationCenter.current()
.setNotificationCategories([messageCategory])
}
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
UNUserNotificationCenter.current().delegate = self
registerNotificationCategories()
return true
}
}
پس از ثبت دستهبندی، هر اعلان با category = «message» در بار APNS دکمههای «پاسخ» و «حذف» را نمایش خواهد داد. پردازش فشارها در userNotificationCenter:didReceive response انجام میشود، جایی که actionIdentifier مشخص میکند کدام دکمه فشار داده شده است.
وقتی کاربر دکمه دستهبندی را فشار میدهد، iOS نماینده UNUserNotificationCenterDelegate را با شیء UNNotificationResponse فراخوانی میکند. response.actionIdentifier شامل شناسه دکمه فشار داده شده است، و response.notification.request.content.userInfo حاوی دادههای سفارشی از بار APNS است. برای UNTextInputAction، response.userText با متن وارد شده توسط کاربر نیز در دسترس است.
توسعهدهندگانی که با Android Notification Channels آشنا هستند، اغلب آنها را با iOS Notification Categories اشتباه میگیرند. با وجود نام مشابه، این مکانیزمها وظایف متفاوتی را حل کرده و به روشهای مختلفی کار میکنند.
در هر دو پلتفرم میتوان هر دو مکانیزم را ترکیب کرد: در اندروید اعلان میتواند متعلق به کانالی با اقدامات NotificationCompat باشد، و در iOS دستهبندی کانالهایی را تکمیل میکند که در iOS thread-id نامیده میشوند و برای گروهبندی اعلانها در مرکز اعلانها استفاده میشوند.
برای اینکه اعلان با دکمههای دستهبندی نمایش داده شود، سرور باید کلید category را در بار APNS قرار دهد. بدون این کلید، سیستم نمیداند کدام دستهبندی را برای اعلان اعمال کند.
{
"aps": {
"alert": {
"title": "پیام جدید",
"body": "آنا: سلام! چطوری؟"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
کلید category باید دقیقاً با شناسه ثبتشده از طریق setNotificationCategories در سمت کلاینت مطابقت داشته باشد. حروف بزرگ و کوچک مهم هستند — «message» و «Message» دستهبندیهای متفاوتی در نظر گرفته میشوند. اگر دستهبندی یافت نشود، اعلان بدون دکمه و بدون خطا در لاگها نمایش داده میشود.
اگر سرور اعلانی با category که در کلاینت ثبت نشده ارسال کند، iOS دستهبندی را نادیده گرفته و اعلان را بدون دکمه نمایش میدهد. خطا ثبت نمیشود و برنامه از عدم تطابق مطلع نمیشود. توصیه میشود لیست دستهبندیها را بین سرور و کلاینت از طریق یک فایل پیکربندی همگامسازی کرده و در هر بهروزرسانی برنامه بررسی کنید.
هنگام طراحی دستهبندی اعلانهای iOS، اصل یک دستهبندی — یک سناریو را رعایت کنید. هر دستهبندی باید با نوع خاصی از تعامل مطابقت داشته باشد: پاسخ به پیام، تأیید اقدام، رد درخواست. سناریوهای مختلف را در یک دستهبندی ترکیب نکنید — این کاربر را سردرگم کرده و پردازش را در نماینده پیچیده میکند.
از UNTextInputAction برای سناریوهایی استفاده کنید که کاربر باید بدون باز کردن برنامه متن وارد کند: پاسخها در پیامرسانها، نظرات، یادداشتهای سریع. اقدامات متنی تعامل را افزایش میدهند — کاربر در ۲ ضربه به جای ۵+ ضربه در برنامه باز، یک اقدام معنادار انجام میدهد.
برای اقدامات خطرناک (حذف، مسدود کردن) از گزینه destructive استفاده کنید. iOS این دکمهها را با رنگ قرمز برجسته میکند و کاربر را از غیرقابل برگشت بودن اقدام آگاه میکند. برای اقداماتی که نیاز به باز کردن قفل دستگاه دارند (مشاهده دادههای شخصی)، authenticationRequired را تنظیم کنید — سیستم قبل از اجرا Face ID یا رمز عبور درخواست میکند.
دستهبندیها را روی دستگاههای مختلف تست کنید: در iPhone با 3D Touch، در iPhone بدون 3D Touch (لمس طولانی)، در iPad و در Mac. رفتار دستهبندیها ممکن است در پلتفرمهای مختلف اپل کمی متفاوت باشد. توجه ویژه — CarPlay: دکمههای دستهبندی روی صفحه خودرو نمایش داده میشوند، اما ورود متن در دسترس نیست، بنابراین UNTextInputAction به طور خودکار در CarPlay مخفی میشود. در watchOS دستهبندیها پشتیبانی نمیشوند — همه اعلانها بدون دکمه نمایش داده میشوند.
سؤالات متداول
محدودیتی وجود ندارد — iOS برای تعداد UNNotificationCategory محدودیتی تعیین نمیکند. با این حال، در عمل توصیه میشود بیش از ۱۰–۱۵ دستهبندی نداشته باشید تا پردازش در نماینده پیچیده نشود. هر دستهبندی میتواند حداکثر ۴ اقدام (دکمه) داشته باشد. بیش از ۴ اقدام توسط سیستم نادیده گرفته میشوند.
نماینده UNUserNotificationCenterDelegate و متد didReceive response را پیادهسازی کنید. response.actionIdentifier را بررسی کنید: UNNotificationDismissActionIdentifier — کشیدن حذف، UNNotificationDefaultActionIdentifier — ضربه روی بدنه، یا شناسه سفارشی دکمه خود. برای دکمههای متنی، متن از طریق response.userText در دسترس است.
Category — اقدامات تعاملی (دکمهها) را برای اعلان تعیین میکند. Thread-id — اعلانها را در مرکز اعلانها بر اساس موضوع گروهبندی میکند. هر دو کلید در بار APNS مشخص میشوند. Category و thread-id مرتبط نیستند: یک اعلان میتواند دستهبندی داشته باشد بدون thread-id و بالعکس.
بله، UNNotificationCategory در macOS 10.14+ (Mojave) در برنامههایی که از UserNotifications framework استفاده میکنند پشتیبانی میشود. رفتار دستهبندیها در macOS مشابه iOS است: با کلیک روی اعلان دکمهها نمایش داده میشوند، پردازش از طریق UNUserNotificationCenterDelegate انجام میشود.
توصیه میشود دستهبندیها را در هر راهاندازی برنامه از طریق setNotificationCategories ثبت کنید. سیستم مجموعه قدیمی دستهبندیها را با هر فراخوانی با مجموعه جدید جایگزین میکند. اگر بهروز نکنید، دستهبندیها بین راهاندازیها حفظ میشوند، اما با تغییر کد، دستهبندیهای قدیمی ممکن است با دستهبندیهای جدید مطابقت نداشته باشند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید