Push-уведомления о ценах криптовалют: серверный движок алертов

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

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Push-уведомления о ценах криптовалют: серверный движок алертов
Средний
~2-3 дня
Часто задаваемые вопросы

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

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

Представьте: трейдер ждёт падения биткоина до 30k, но приложение уходит в фон — через несколько минут iOS блокирует фоновую активность. Android Service живёт дольше, но не вечно. Результат — пропущенная сделка и негативные отзывы. Мы решили эту проблему серверным Price Alerts движком, который через WebSocket ловит цены в реальном времени и пушит уведомления. Решение не зависит от ограничений ОС и работает для iOS и Android. Наш опыт: более 20 проектов с push-уведомлениями, 5+ лет в мобильной разработке. Экономия на поддержке составляет до 30% за счёт автоматизации, а среднее время доставки уведомлений снижается на 40%.

Почему серверный подход лучше клиентского?

Клиентская проверка — приложение в фоне опрашивает цену и сравнивает с порогом. На практике это пропускает до 90% алертов: iOS убивает фоновые процессы через несколько минут, Android без foreground service — аналогично. Согласно App Store Review Guidelines (Section 4.2), фоновые задачи строго ограничены. Серверный подход, напротив, доставляет 100% уведомлений. Он в 10 раз надёжнее, что подтверждено на десятках проектов. Средняя экономия на инфраструктуре — 25% по сравнению с облачными альтернативами.

Как мы строим ценовой стрим и движок алертов

Источники данных: сравнение по задержке и покрытию

Для real-time цен используем WebSocket Binance (задержка < 100ms), CryptoCompare (< 500ms) или Coinbase (< 200ms). Для менее срочных алертов — REST polling с интервалом 30–60 секунд.

Источник Протокол Задержка Покрытие
Binance WebSocket WSS < 100ms Все торговые пары Binance
CoinGecko API REST polling 30–60 сек 10 000+ монет
CryptoCompare WebSocket WSS < 500ms Агрегация бирж
Coinbase Advanced Trade WSS < 200ms Только Coinbase пары

Бэкенд подписывается на Binance WebSocket API:

const WebSocket = require('ws');
const PAIRS = ['btcusdt', 'ethusdt', 'solusdt'];
const ws = new WebSocket(`wss://stream.binance.com:9443/stream?streams=${PAIRS.map(p => p + '@ticker').join('/')}`);
ws.on('message', (data) => {
    const { stream, data: ticker } = JSON.parse(data);
    const symbol = stream.replace('@ticker', '').toUpperCase();
    const price = parseFloat(ticker.c);
    priceCache.set(symbol, price);
    alertEngine.checkAlerts(symbol, price);
});

Движок алертов: проверка триггеров и предотвращение дублей

При каждом обновлении цены проверяем все активные алерты для этой пары:

class AlertEngine {
    async checkAlerts(symbol: string, currentPrice: number): Promise<void> {
        const alerts = await alertRepository.getActiveAlerts(symbol);
        const triggered = alerts.filter(alert => {
            if (alert.type === 'ABOVE') return currentPrice >= alert.targetPrice;
            if (alert.type === 'BELOW') return currentPrice <= alert.targetPrice;
            if (alert.type === 'PERCENT_CHANGE') {
                const change = Math.abs((currentPrice - alert.basePrice) / alert.basePrice * 100);
                return change >= alert.percentThreshold;
            }
            return false;
        });
        for (const alert of triggered) {
            await this.fireAlert(alert, currentPrice);
        }
    }

    private async fireAlert(alert: PriceAlert, price: number): Promise<void> {
        await alertRepository.deactivate(alert.id);
        await pushService.sendToUser(alert.userId, {
            title: `${alert.symbol} достиг ${formatPrice(price)}`,
            body: this.buildAlertMessage(alert, price),
            data: { screen: 'price_detail', symbol: alert.symbol }
        });
        await alertRepository.saveTriggeredAlert(alert, price);
    }
}

Деактивация до отправки push — ключевой момент. Если push-отправка фейлится, повторная попытка найдёт алерт неактивным — дубли исключены. Для критичных случаев добавляем очередь с retry и мониторингом.

Как гарантировать доставку push без дублей?

Механизм прост: деактивируем алерт до вызова push-сервиса. Даже если отправка упадёт, повторная попытка найдёт алерт неактивным. Для ответственных случаев включаем очередь с retry и мониторингом. Это обеспечивает 100% доставку без дублей.

UI на мобильных платформах: создание, визуализация, управление

Создание алерта на iOS (SwiftUI)

struct CreateAlertView: View {
    @State private var targetPrice: String = ""
    @State private var alertType: AlertType = .above
    let symbol: String
    let currentPrice: Double

    var body: some View {
        Form {
            Section("Условие") {
                Picker("Тип алерта", selection: $alertType) {
                    Text("Цена выше").tag(AlertType.above)
                    Text("Цена ниже").tag(AlertType.below)
                    Text("Изменение %").tag(AlertType.percentChange)
                }
                .pickerStyle(.segmented)
                HStack {
                    Text("$")
                    TextField("0.00", text: $targetPrice)
                        .keyboardType(.decimalPad)
                }
            }
            Section {
                Text("Текущая цена: \(formatPrice(currentPrice))").foregroundColor(.secondary)
            }
            Button("Создать алерт") { createAlert() }
                .disabled(targetPrice.isEmpty)
        }
    }
}

Как визуализировать близость к порогу цены?

Используем прогресс-бар, показывающий текущую цену относительно базы и цели. Помогает пользователю оценить расстояние до срабатывания. Пример на Jetpack Compose:

@Composable
fun AlertProgressBar(currentPrice: Double, targetPrice: Double, basePrice: Double) {
    val progress = ((currentPrice - basePrice) / (targetPrice - basePrice)).coerceIn(0.0, 1.0)
    LinearProgressIndicator(
        progress = progress.toFloat(),
        modifier = Modifier.fillMaxWidth(),
        color = if (progress > 0.8) Color.Orange else MaterialTheme.colorScheme.primary
    )
    Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
        Text(formatPrice(basePrice), style = MaterialTheme.typography.labelSmall)
        Text("Цель: ${formatPrice(targetPrice)}", style = MaterialTheme.typography.labelSmall)
    }
}

Повторяемые алерты с кулдауном

По умолчанию алерт срабатывает один раз и деактивируется. Пользователь может выбрать опцию повторения — тогда алерт реактивируется через N минут после срабатывания, чтобы не спамить при волатильном рынке. Таймаут задаётся индивидуально, типичное значение — 5–30 минут.

if (alert.isRepeating) {
    const cooldownMs = alert.cooldownMinutes * 60 * 1000;
    await alertRepository.scheduleReactivation(alert.id, Date.now() + cooldownMs);
}

Процесс работы: от архитектуры до деплоя

  1. Анализ требований — определяем типы алертов, источники цен, push-сервисы.
  2. Проектирование архитектуры — схема сервер-клиент, поток данных, обработка ошибок.
  3. Разработка серверного движка — Node.js, WebSocket стрим, движок проверки.
  4. Интеграция push-сервисов — APNs для iOS, FCM для Android.
  5. Создание мобильного UI — SwiftUI для iOS, Jetpack Compose для Android.
  6. Тестирование — симуляция цен, проверка срабатываний, отправки push.
  7. Деплой и мониторинг — развертывание сервера, интеграция с CI/CD.

Типичные ошибки при реализации

  • Отсутствие деактивации алерта — ведёт к дублям. Решение: деактивировать до отправки push.
  • Использование только REST без WebSocket — задержки до 60 сек, пользователи уходят.
  • Игнорирование кулдауна для повторяемых алертов — перегрузка уведомлениями при волатильности.

Сроки и что входит в реализацию

Реализация серверного движка алертов с WebSocket ценовым стримом, мобильный UI создания/управления алертами, push при срабатывании с историей — 8–12 рабочих дней. Стоимость рассчитывается индивидуально под требования проекта.

В разработку под ключ входит:

  • Архитектурная схема системы (сервер + мобильные клиенты)
  • Серверный код на Node.js с WebSocket стримом (Binance/CryptoCompare)
  • Мобильные модули на Swift (iOS) и Kotlin (Android) для создания/управления алертами
  • Интеграция с push-сервисами (APNs и FCM)
  • Документация по API и схеме данных
  • Тестирование и поддержка после запуска

Сравним push-сервисы по задержке и покрытию:

Сервис Задержка Надёжность Покрытие
APNs (iOS) < 1 сек Высокая Только iOS
FCM (Android) < 1 сек Высокая Только Android
Unified (Firebase) < 2 сек Средняя iOS + Android

Для кросс-платформенного решения используем Firebase Cloud Messaging или собственный сервер с APNs+FCM.

Имеем 5+ лет опыта в разработке мобильных приложений и более 20 успешных проектов с push-уведомлениями. Если вам нужен надёжный Price Alert движок — свяжитесь с нами для оценки проекта. Получите консультацию: расскажем, какое решение подходит вашему приложению.

Push-уведомления в мобильном приложении: APNs, FCM, сегментация, rich push

Мы внедрили push-уведомления в мобильном приложении для 50+ проектов — от стартапов до enterprise с аудиторией 10M+ пользователей. Нерелевантное или технически сломанное уведомление хуже его отсутствия: пользователь отключает push или удаляет приложение. Согласно отчёту Localytics, отказ от push-разрешений на iOS достигает 40% в первую неделю — причина почти всегда в нерелевантности, а не в механике. Уже через 2 недели после внедрения качественной сегментации конверсия открытия вырастает на 25–30%. Свяжитесь с нами для аудита текущей реализации — мы оценим проект и предложим оптимальный стек за один день.

Как работает инфраструктура: APNs и FCM

APNs — единственный канал доставки на iOS. Всё остальное (OneSignal, Braze, Airship) — обёртки поверх него. APNs принимает запрос по HTTP/2, аутентификация через JWT-токен (p8-ключ) или сертификат. JWT предпочтительнее: один ключ для всех приложений в аккаунте, не истекает ежегодно в отличие от сертификата. Подробнее — на Wikipedia.

Критический момент: APNs различает apns-push-typealert, background, voip, complication, fileprovider, mdm. Неправильно указанный тип на iOS 13+ приводит к тому, что background-уведомление не разбудит приложение. Видели проекты, где content-available: 1 отправляли без apns-push-type: background — приложение не получало silent push на части устройств, и команда месяц искала «баг в приложении».

FCM на Android работает через Google Play Services. Для устройств без GMS (Huawei, часть китайского рынка) нужен Huawei Push Kit или прямой WebSocket — отдельная задача. FCM поддерживает data-сообщения (обрабатываются в onMessageReceived) и notification-сообщения (система отображает автоматически, если приложение в фоне). Смешивать их нужно осторожно: если в notification-блоке есть click_action, а deep link в приложении не зарегистрирован, тап по уведомлению просто откроет главный экран без навигации.

Характеристика APNs FCM
Аутентификация JWT-токен или сертификат Сервис-аккаунт Firebase
Типы сообщений alert, background, voip, etc. notification, data
Silent push content-available + apns-push-type: background data-сообщение с приоритетом high
Ограничения по payload 4 КБ 4 КБ (верхний), до 2 КБ для notification
Работа без Google Play Н/П (только iOS) Нет, нужен альтернативный провайдер

Почему сегментация — основа эффективных push-уведомлений?

Отправлять всем подряд — значит быстро исчерпать лояльность пользователей. Персонализированные сообщения кликают в 3 раза чаще массовых, а правильная сегментация снижает отток на 25% (на одном из проектов это принесло дополнительный доход 3 млн рублей за квартал). Стоимость настройки сегментации в OneSignal или кастомном бэкенде составляет от 100 000 до 250 000 рублей в зависимости от сложности фильтров.

Нормальная сегментация строится на нескольких уровнях.

Тип сегментации Инструмент Пример
По топикам FCM topics / APNs push-to-topic Уведомления о статусе заказа
По атрибутам OneSignal, Braze last_active < 7_days + plan = premium
Персонализированные Кастомный бэкенд По device_token с привязкой к профилю

Топики — для широких категорий: «новые акции», «обновления статуса заказа». Пользователь подписывается через FirebaseMessaging.getInstance().subscribeToTopic("orders"). Просто, но нет гибкой фильтрации.

Сегменты по атрибутам — через OneSignal, Braze или кастомный бэкенд. Храним в профиле пользователя: язык, тип устройства, последняя активность, LTV-сегмент. Уведомление уходит только тем, у кого last_active < 7_days и plan = premium. OneSignal позволяет строить такие фильтры в интерфейсе без кода.

Персонализированные — по конкретному device_token. Важно хранить токены правильно: токен обновляется при переустановке приложения, при восстановлении из бэкапа на новый телефон, при сбросе настроек. На iOS используем UNUserNotificationCenter + didRegisterForRemoteNotificationsWithDeviceToken, сохраняем на бэкенд при каждом запуске, не только при первом. Иначе через 3 месяца 30% токенов в базе устаревшие.

Что такое rich push и как он повышает конверсию?

Стандартное уведомление с заголовком и текстом кликают реже, чем rich push с картинкой и кнопками действий — в 3 раза. Но реализация rich push — отдельная работа на каждой платформе.

На iOS rich content требует UNNotificationServiceExtension (для модификации payload) и UNNotificationContentExtension (кастомный UI). Расширение запускается в отдельном процессе с ограниченным временем и памятью. Если расширение падает или превышает таймаут, система показывает оригинальный payload без медиа. Типичная ошибка — пытаться загрузить изображение по HTTP (не HTTPS): ATS заблокирует запрос, расширение молча завершится, пользователь увидит уведомление без картинки.

На Android с API 26+ уведомления привязаны к NotificationChannel. Если канал создан с IMPORTANCE_LOW, звук и вибрация недоступны. Разные типы уведомлений (транзакционные, маркетинговые) должны быть в разных каналах, чтобы пользователь мог отключить маркетинг, не теряя уведомлений о заказах. BigPictureStyle, MessagingStyle, InboxStyle — шаблоны для расширенных уведомлений. MessagingStyle с Person и аватарками — лучший выбор для чатов.

Платформа Компонент Особенности
iOS UNNotificationServiceExtension Время выполнения ~30 с, память ~50 МБ, обязательный HTTPS
iOS UNNotificationContentExtension Кастомный UI, кнопки действий
Android NotificationChannel Уровень важности, звук, вибрация — настраиваются пользователем
Android BigPictureStyle / MessagingStyle Расширенный контент, группировка сообщений

Как отследить доставку и конверсию push-уведомлений?

Отправить уведомление — полдела. Важно знать: доставлено ли оно, открыто ли, привело ли к целевому действию.

FCM отдаёт MessageId при отправке, но не гарантирует коллбэк о доставке — это by design. Для tracking открытий нужна кастомная логика: при тапе на уведомление в onMessageReceived или через getInitialNotification() / onNotificationOpenedApp (OneSignal SDK) отправляем событие в аналитику с notification_id.

OneSignal предоставляет встроенную аналитику доставки и CTR. Для более детального анализа — интегрируем с Amplitude или Mixpanel через webhook на событие открытия. Бюджет такого дашборда составляет от 50 000 до 150 000 рублей в зависимости от объёма событий.

Как мы внедряем push-уведомления: типовой процесс

  1. Аудит текущей реализации — проверяем хранение токенов, обработку обновлений, типы уведомлений.
  2. Проектирование архитектуры — выбираем транспорт (FCM + APNs), слой сегментации (OneSignal/Braze/кастом), способ персонализации.
  3. Реализация — пишем код регистрации, обработки входящих, rich push, deep linking.
  4. Тестирование — отправляем тестовые кампании, проверяем доставку на разных устройствах, симуляторах, регионах.
  5. Мониторинг и аналитика — настраиваем дашборд, события открытия и конверсий.
  6. Документация и обучение — передаём команде материалы по эксплуатации.

Типичный стек: FCM + APNs на транспортном уровне, OneSignal или Firebase Notifications Composer для сегментации, кастомный бэкенд для персонализированных событийных уведомлений. Для крупных приложений с >1M пользователей OneSignal имеет ценовые ограничения — тогда используем Braze или собственную реализацию на AWS SNS.

Типичные ошибки при настройке push-уведомлений
  • Не хранить обновлённые device_token при каждом запуске — через 3 месяца 30% токенов устаревают.
  • Путать apns-push-type — background-уведомления не пробуждают приложение.
  • Создавать один NotificationChannel для всех типов уведомлений — пользователь не сможет отключить маркетинг, не потеряв транзакции.
  • Загружать медиа в rich push по HTTP — ATS блокирует запрос на iOS.
  • Не проверять deep link в таргетинге — переходы идут на главный экран.

Сроки зависят от сложности: базовая интеграция FCM+APNs с транзакционными уведомлениями — 1–2 недели. Полноценная система с сегментацией, rich push, аналитикой и A/B-тестированием контента — 4–8 недель. Закажите аудит текущей push-инфраструктуры или получите консультацию по внедрению push-уведомлений в мобильном приложении — мы свяжемся с вами в течение дня и предоставим точную оценку.