اعلان‌های محلی در توسعه موبایل: ماهیت، انواع و نحوه کار

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

اعلان محلی پیامی است که برنامه بدون مشارکت سرور راه دور برای کاربر ارسال می‌کند. تمام داده‌ها مستقیماً روی دستگاه گیرنده پردازش و نمایش داده می‌شوند. چنین مکانیزمی برای یادآوری‌ها، تایمرها و زنگ‌های بیدارباش وقتی برنامه در پس‌زمینه یا بسته است مناسب می‌باشد. طبق Apple Developer Documentation، UNUserNotificationCenter مدیریت متمرکز اعلان‌های محلی در iOS را فراهم می‌کند.

نکات اصلی

  • اعلان محلی — پیامی که توسط دستگاه بدون مشارکت سرور برنامه‌ریزی و تحویل داده می‌شود
  • پلتفرم‌ها — Android از NotificationManager استفاده می‌کند، iOS از UNUserNotificationCenter استفاده می‌کند
  • برنامه‌ریزی — اعلان‌ها می‌توانند بر اساس زمان، موقعیت جغرافیایی یا تقویم به تأخیر بیفتند
  • محدودیت‌ها — اعلان‌های محلی بین دستگاه‌ها کار نمی‌کنند و نیاز به منطق همگام‌سازی جداگانه دارند
  • UX — اعلان‌های به درستی پیکربندی شده تعامل کاربر را افزایش می‌دهند و کاربر را به برنامه بازمی‌گردانند

اعلان محلی چیست؟

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

چنین اعلان‌هایی بدون توجه به وضعیت برنامه کار می‌کنند: چه فعال باشد، چه کوچک شده یا کاملاً بسته باشد. سیستم عامل تحویل را در زمان تعیین شده بر عهده می‌گیرد و توسعه‌دهنده فقط محتوا و trigger را مشخص می‌کند.

سیستم تحویل اعلان محلی را حتی در صورت عدم وجود شبکه تضمین می‌کند. این مزیت کلیدی نسبت به اعلان‌های push است که نیاز به اتصال پایدار اینترنت و سرور فعال دارند.

اجزای اصلی درخواست

هر اعلان محلی از سه بخش تشکیل شده است: محتوا (عنوان، متن، صدا)، trigger (شرط زمانی یا جغرافیایی) و شناسه درخواست. شناسه امکان لغو یا به‌روزرسانی اعلان را قبل از تحویل آن فراهم می‌کند.

توسعه‌دهنده می‌تواند تا 64 اعلان محلی برای یک برنامه در iOS و تعداد نامحدود در Android تنظیم کند. تفاوت به محدودیت‌های معماری سیستم‌های عامل مربوط می‌شود.

اعلان‌های محلی در iOS و Android چگونه کار می‌کنند؟

هر دو پلتفرم APIهای خود را برای کار با اعلان‌های محلی ارائه می‌دهند. در iOS عنصر مرکزی UNUserNotificationCenter است، در Android — NotificationManager. با وجود رابط‌های مختلف، منطق یکسان است: برنامه درخواستی ایجاد می‌کند، آن را در سیستم ثبت می‌کند و سیستم عامل اعلان را در زمان مشخص شده تحویل می‌دهد.

iOS برای رویدادهای تقویمی از UNCalendarNotificationTrigger، برای بازه‌های زمانی از UNTimeIntervalNotificationTrigger و برای موقعیت جغرافیایی از UNLocationNotificationTrigger استفاده می‌کند. Android AlarmManager، WorkManager و برنامه‌ریزی دقیق از طریق setExact را ارائه می‌دهد.

از نسخه Android 12 — SCHEDULE_EXACT_ALARM نیاز به مجوز ویژه از کاربر دارد. در iOS مجوز یک بار از طریق UNUserNotificationCenter.requestAuthorization درخواست می‌شود و کاربر سطح دسترسی را انتخاب می‌کند: بنرها، صداها، نشان‌ها.

انواع اعلان‌های محلی

اعلان‌های محلی بر اساس نوع trigger طبقه‌بندی می‌شوند، نه بر اساس محتوا. هر نوع تعیین می‌کند که اعلان چه زمانی و تحت چه شرایطی به کاربر نشان داده شود.

مقایسه triggerها بر اساس پلتفرم

در iOS و Android انواع triggerها متفاوت پیاده‌سازی شده‌اند، اگرچه طبقه‌بندی منطقی یکسان است. iOS برای تاریخ‌ها از UNCalendarNotificationTrigger، برای بازه‌ها از UNTimeIntervalNotificationTrigger و برای موقعیت جغرافیایی از UNLocationNotificationTrigger استفاده می‌کند. Android AlarmManager با setExact و setRepeating و همچنین WorkManager برای وظایف تأخیری را ارائه می‌دهد.

نوع triggerتوضیحاتمثال
بازه زمانیاعلان پس از N ثانیه از راه‌اندازیتایمر شمارش معکوس
تاریخ تقویمیاعلان در زمان و تاریخ مشخصیادآوری جلسه
موقعیت جغرافیاییاعلان هنگام ورود/خروج از منطقهیادآوری نزدیک فروشگاه
بی‌قیدتحویل فوری هنگام فراخوانی APIاعلان دانلود

در iOS همچنین UNNotificationAttachment در دسترس است — پیوست تصویر، صدا یا ویدئو در بدنه اعلان. Android از قالب‌های سفارشی با دکمه‌ها و تصاویر بزرگ از طریق NotificationCompat.Style پشتیبانی می‌کند.

انتخاب trigger به سناریو بستگی دارد: یادآوری‌های تقویمی از طریق trigger تقویمی بهترین عملکرد را دارند و یادآوری‌های جغرافیایی — از طریق موقعیت جغرافیایی. triggerهای بازه‌ای برای رویدادهای منظم با دوره ثابت مناسب هستند.

رفتار triggerها در پس‌زمینه

در iOS اعلان‌های محلی توسط سیستم حتی با برنامه بسته تحویل داده می‌شوند — UNUserNotificationCenter صف را مستقل مدیریت می‌کند. در Android تحویل به مکانیزم انتخاب شده بستگی دارد: AlarmManager حتی با صفحه خاموش فعال می‌شود و WorkManager با در نظر گرفتن صرفه‌جویی در انرژی.

سناریوهای استفاده در برنامه‌های موبایل

اعلان‌های محلی مسائلی را حل می‌کنند که زیرساخت خارجی اضافی یا غیرقابل دسترس است. سناریوهای اصلی: یادآوری‌ها، تایمرها، نکات آموزشی و اقدامات به تأخیر افتاده.

  • یادآوری‌ها — برنامه تقویم یک اعلان محلی برای تاریخ مشخص رویداد ایجاد می‌کند
  • نکات آموزشی — یک روز پس از نصب، برنامه نکته‌ای درباره صفحه نمایش می‌دهد
  • تایمرها — تایمر آشپزخانه حتی با برنامه بسته پس از زمان مشخص فعال می‌شود
  • پیشرفت عملیات — اعلان پایان دانلود یا خروجی داده

تحقیقات Localytics نشان می‌دهد که برنامه‌های استفاده‌کننده از یادآوری‌های محلی 35٪ کاربران بیشتری را در هفته اول پس از نصب حفظ می‌کنند. این اعلان‌های محلی را به ابزاری قدرتمند برای آموزش اولیه تبدیل می‌کند.

مهم است که از فراوانی سوءاستفاده نکنید — سیستم خود اعلان‌های یک برنامه را گروه‌بندی می‌کند و کاربر می‌تواند اگر آزاردهنده باشند همه اعلان‌های محلی را خاموش کند. فراوانی بهینه بیش از 2–3 اعلان در روز برای رویدادهای غیر بحرانی نیست.

مثال برنامه‌ریزی در Android

برای برنامه‌ریزی اعلان محلی در Android از NotificationManager همراه با AlarmManager استفاده کنید. از Android 8+ ابتدا باید یک کانال اعلان ایجاد کنید، در غیر این صورت اعلان نمایش داده نخواهد شد.

kotlin
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"

val channel = NotificationChannel(
    channelId,
    "یادآوری‌ها",
    NotificationManager.IMPORTANCE_HIGH
).apply {
    description = "کانال یادآوری وظایف"
}

val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)

val intent = Intent(this, ReminderReceiver::class.java).apply {
    putExtra("notification_id", notificationId)
    putExtra("channel_id", channelId)
}

val pendingIntent = PendingIntent.getBroadcast(
    this, notificationId.hashCode(),
    intent, PendingIntent.FLAG_UPDATE_CURRENT
)

val alarmManager = getSystemService(AlarmManager::class.java)
alarmManager.setExact(
    AlarmManager.RTC_WAKEUP,
    triggerTimeMillis,
    pendingIntent
)

در Android 12+ قبل از فراخوانی setExact مجوز SCHEDULE_EXACT_ALARM را بررسی کنید. اگر مجوز داده نشده است — از setWindow استفاده کنید که تحویل را در یک پنجره زمانی تضمین می‌کند.

پردازش در BroadcastReceiver

هنگام فعال شدن AlarmManager سیستم یک Intent پخشی ارسال می‌کند که توسط BroadcastReceiver دریافت می‌شود. در داخل آن باید از طریق NotificationManager یک اعلان ایجاد و نمایش داده شود. اطمینان حاصل کنید که PendingIntent از FLAG_UPDATE_CURRENT استفاده می‌کند، در غیر این صورت با تغییر داده‌ها اعلان‌های قدیمی به استفاده از Intent منسوخ ادامه خواهند داد.

مثال برنامه‌ریزی در iOS

در iOS اعلان‌های محلی از طریق UNUserNotificationCenter با استفاده از UNMutableNotificationContent و یکی از triggerها ایجاد می‌شوند. قبل از برنامه‌ریزی باید از کاربر مجوز گرفت.

swift
import UserNotifications

let center = UNUserNotificationCenter.current()

center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
    guard granted else { return }
}

let content = UNMutableNotificationContent()
content.title = "یادآوری وظیفه"
content.body = "فراموش نکنید گزارش را تا ساعت 18:00 تکمیل کنید"
content.sound = .default
content.userInfo = ["task_id": "42"]

let trigger = UNTimeIntervalNotificationTrigger(
    timeInterval: 3600,
    repeats: false
)

let request = UNNotificationRequest(
    identifier: "task_reminder_42",
    content: content,
    trigger: trigger
)

center.add(request)

iOS تا 64 درخواست همزمان اعلان محلی را پشتیبانی می‌کند. اگر حد تجاوز شود — سیستم درخواست‌های جدید را تا زمانی که درخواست‌های فعال تحویل یا لغو شوند رد می‌کند. برای بررسی صف فعلی از getPendingNotificationRequests استفاده کنید.

پردازش پاسخ delegate

وقتی کاربر با اعلان محلی iOS تعامل می‌کند، متد userNotificationCenter:didReceive response delegate UNUserNotificationCenterDelegate فراخوانی می‌شود. در این متد شناسه درخواست، actionIdentifier (کدام دکمه فشرده شده) و userInfo سفارشی در دسترس است. این امکان تشخیص باز کردن ساده اعلان از فشردن دکمه خاص را فراهم می‌کند.

بهترین روش‌های اعلان‌های محلی

برای اینکه اعلان‌های محلی مفید باشند و کاربر را آزار ندهند، چند قانون کلیدی را رعایت کنید. اول: فراوانی را کنترل کنید — بیش از 2–3 اعلان در روز برای رویدادهای غیر بحرانی، در غیر این صورت کاربر همه اعلان‌های برنامه را خاموش می‌کند.

دوم: به کاربر انتخاب بدهید. در رابط کاربری امکان خاموش کردن انواع خاصی از اعلان‌های محلی را اضافه کنید. در Android برای این کار از NotificationChannel جداگانه با importance پایین استفاده کنید، در iOS — یک دسته جداگانه در تنظیمات برنامه.

سوم: ارتباط زمینه‌ای — اعلان باید زمانی ظاهر شود که کاربر به آن نیاز دارد. triggerهای جغرافیایی برای یادآوری کارهای نزدیک خانه ایده‌آل هستند، تقویمی — برای جلسات، بازه‌ای — برای اقدامات منظم مانند نوشیدن آب یا حرکات کششی. انواع را بدون نیاز مخلوط نکنید.

چهارم: روی دستگاه‌های واقعی تست کنید. شبیه‌ساز iOS همه سناریوهای تحویل اعلان‌های محلی، به ویژه در پس‌زمینه را شبیه‌سازی نمی‌کند. در Android از adb shell dumpsys notification برای بررسی صف اعلان‌های برنامه‌ریزی شده و پارامترهای آن‌ها استفاده کنید. پنجم: همیشه به کاربر امکان خاموش کردن اعلان‌ها را از طریق رابط برنامه بدهید — این الزام UX و رهنمودهای App Store Review است.

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

اعلان محلی چه تفاوتی با push دارد؟

اعلان محلی توسط دستگاه بدون مشارکت سرور برنامه‌ریزی و تحویل داده می‌شود. اعلان push نیاز به سرویس خارجی (FCM, APNS) و اتصال اینترنت دارد. اعلان‌های محلی آفلاین کار می‌کنند، push — فقط با دسترسی به شبکه.

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

iOS به 64 درخواست همزمان برنامه‌ریزی شده محدود می‌کند. Android محدودیت دقیقی ندارد، اما بیش از 500 اعلان می‌تواند عملکرد سیستم را کاهش دهد و بر زمان تحویل تأثیر بگذارد.

آیا می‌توان اعلان محلی را پس از برنامه‌ریزی لغو کرد؟

بله، در iOS از removePendingNotificationRequests با شناسه درخواست استفاده کنید. در Android NotificationManager.cancel را فراخوانی کنید یا PendingIntent را از طریق AlarmManager لغو کنید. شناسه یکتا برای لغو الزامی است.

آیا برای اعلان‌های محلی نیاز به مجوز کاربر است؟

در iOS مجوز الزاماً از طریق requestAuthorization درخواست می‌شود. در Android 13+ (Tiramisu) نیز مجوز POST_NOTIFICATIONS مورد نیاز است. نسخه‌های قدیمی‌تر Android برای اعلان‌های محلی نیاز به مجوز صریح ندارند.

چگونه به اعلان محلی دکمه اضافه کنیم؟

در iOS UNNotificationAction ایجاد کرده و به UNNotificationCategory اضافه کنید. در Android از NotificationCompat.Builder.addAction با PendingIntent برای BroadcastReceiver استفاده کنید. هر دکمه یک عمل جداگانه در برنامه راه‌اندازی می‌کند.

خلاصه

  • اعلان‌های محلی — پیام‌هایی که توسط دستگاه بدون زیرساخت سرور برنامه‌ریزی و تحویل داده می‌شوند
  • UNUserNotificationCenter — API اصلی برای کار با اعلان‌های محلی در iOS
  • NotificationManager — API اصلی برای کار با اعلان‌های محلی در Android
  • انواع trigger — بازه زمانی، تاریخ تقویمی، موقعیت جغرافیایی و تحویل بی‌قید
  • محدودیت‌ها — iOS به 64 درخواست برنامه‌ریزی محدود می‌کند، Android محدودیت دقیقی ندارد
  • مجوزها — در iOS و Android 13+ رضایت صریح کاربر برای نمایش اعلان‌ها لازم است
  • آفلاین — اعلان‌های محلی بدون اتصال اینترنت کار می‌کنند که آن‌ها را از push قابل اطمینان‌تر می‌کند

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

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

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

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