Реалізація Scheduled Notifications у мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація Scheduled Notifications у мобільному додатку
Простий
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація Scheduled Notifications в мобільному додатку

Scheduled Notifications — це сповіщення з точним часом доставки, заданим заздалегідь. Від простих "нагадати через 30 хвилин" до щоденних нагадувань у конкретний час користувача. Технічно це або локальні сповіщення (клієнт сам планує), або серверна відправка через FCM/APNs за розкладом.

Коли що вибирати

Локальні сповіщення — якщо час прив'язаний до пристрою користувача і не змінюється з сервера. Трекер звичок, нагадування прийняти ліки, будильник-подія.

Серверні scheduled — якщо потрібна централізована логіка: маркетингові рассилки за розкладом, нагадування про подію всім учасникам, сповіщення про дедлайн з врахуванням часового поясу користувача.

Серверна відправка за розкладом

OneSignal підтримує scheduled delivery прямо в API:

{
  "app_id": "YOUR_APP_ID",
  "include_aliases": { "external_id": ["user_44521"] },
  "contents": { "uk": "Зустріч з командою через 15 хвилин" },
  "send_after": "2024-03-20 14:45:00 UTC",
  "delayed_option": "timezone",
  "delivery_time_of_day": "9:00AM"
}

delayed_option: "timezone" — доставити в зазначений час з урахуванням часового поясу кожного одержувача. Корисно для рассилок "доброго ранку".

Для власного бекенду — cron job або завдання через Celery/BullMQ:

// Node.js + BullMQ
const notificationQueue = new Queue('notifications', { connection: redis });

async function scheduleNotification(userId, content, sendAt) {
    const delay = sendAt.getTime() - Date.now();
    await notificationQueue.add(
        'send_push',
        { userId, content },
        { delay, attempts: 3, backoff: { type: 'exponential', delay: 5000 } }
    );
}

attempts: 3 з exponential backoff — обов'язково. FCM іноді повертає 503, потрібна повторна спроба.

Локальне планування на iOS

// Нагадування щодня о 8:00
func scheduleHabitReminder(habitId: String, name: String) {
    let content = UNMutableNotificationContent()
    content.title = name
    content.body = "Не забудьте позначити як виконане"
    content.sound = .default
    content.userInfo = ["habit_id": habitId]

    var components = DateComponents()
    components.hour = 8
    components.minute = 0

    let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: true)
    let request = UNNotificationRequest(
        identifier: "habit-\(habitId)",
        content: content,
        trigger: trigger
    )

    UNUserNotificationCenter.current().add(request) { error in
        if let error { print("Schedule failed: \(error)") }
    }
}

// Змінити час нагадування (видалити старе, додати нове)
func rescheduleReminder(habitId: String, newHour: Int, newMinute: Int) {
    UNUserNotificationCenter.current()
        .removePendingNotificationRequests(withIdentifiers: ["habit-\(habitId)"])
    // ... створюємо новий request з оновленими компонентами
}

Локальне планування на Android з WorkManager

AlarmManager точний, але не переживає перезавантаження. WorkManager переживає перезавантаження, але час виконання приблизний (±15 хвилин на Android 12+ через Doze). Вибір залежить від вимог до точності.

// WorkManager — для некритичних за часом нагадувань
fun scheduleHabitReminder(habitId: String, reminderHour: Int, reminderMinute: Int) {
    // Обчислюємо затримку до наступного спрацювання
    val now = Calendar.getInstance()
    val target = Calendar.getInstance().apply {
        set(Calendar.HOUR_OF_DAY, reminderHour)
        set(Calendar.MINUTE, reminderMinute)
        set(Calendar.SECOND, 0)
        if (before(now)) add(Calendar.DAY_OF_YEAR, 1)
    }
    val delayMs = target.timeInMillis - now.timeInMillis

    val workRequest = OneTimeWorkRequestBuilder<ReminderWorker>()
        .setInitialDelay(delayMs, TimeUnit.MILLISECONDS)
        .setInputData(workDataOf(
            "habit_id" to habitId,
            "next_reminder_hour" to reminderHour,
            "next_reminder_minute" to reminderMinute
        ))
        .build()

    WorkManager.getInstance(context)
        .enqueueUniqueWork("habit-$habitId", ExistingWorkPolicy.REPLACE, workRequest)
}

// У Worker — показуємо сповіщення та плануємо наступне
class ReminderWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        val habitId = inputData.getString("habit_id") ?: return Result.failure()
        showNotification(habitId)

        // Плануємо наступний день
        scheduleHabitReminder(
            habitId,
            inputData.getInt("next_reminder_hour", 8),
            inputData.getInt("next_reminder_minute", 0)
        )
        return Result.success()
    }
}

ExistingWorkPolicy.REPLACE — якщо користувач змінив час нагадування, стара завдання замінюється новою.

Управління нагадуваннями в UI

Користувач повинен бачити заплановані нагадування та управляти ними. На iOS:

// Завантажити всі заплановані нагадування
func loadPendingReminders() async -> [ScheduledReminder] {
    return await withCheckedContinuation { continuation in
        UNUserNotificationCenter.current().getPendingNotificationRequests { requests in
            let reminders = requests.compactMap { ScheduledReminder(from: $0) }
            continuation.resume(returning: reminders)
        }
    }
}

Відображаємо в списку з можливістю редагувати час або видалити. При видаленні — removePendingNotificationRequests + видалення з WorkManager (Android).

Графік

Реалізація scheduled notifications з UI управління розкладом, підтримкою перезавантаження на Android та обмеженням 64 сповіщень на iOS — 3–5 робочих днів. Якщо додається серверне планування через OneSignal або власну чергу — ще 2–3 дні.