Ваша система моніторингу виявила проблему — температура в серверній піднялася до 45°C о 3 ночі. Push-сповіщення прийшло о 9 ранку, коли смартфон підключився до Wi-Fi. Обладнання перегрілося. Це неприпустима затримка. У нашій практиці ми стикалися з такими інцидентами і виробили надійну архітектуру критичних алертів для IoT-датчиків, де доставка займає не більше 3 секунд. Ми використовуємо комбінацію FCM high priority та APNs critical alerts, які гарантують отримання навіть у режимі «Не турбувати». Досвід команди — 10+ років у мобільній розробці та IoT. Ми також реалізували багаторівневу систему пріоритетів: від info (батарея розряджена) до emergency (витік CO). Для критичних подій ми гарантуємо доставку за 1-2 секунди у 99.9% випадків.
Apple Developer Documentation зазначає, що entitlement на критичні сповіщення видається лише додаткам із чіткою потребою в порушенні тиші. Ми допомагаємо отримати його та правильно налаштувати.
Чому стандартний FCM не підходить для критичних IoT-алертів?
FCM нормальний пріоритет (normal) буферизує доставку коли пристрій у Doze Mode. Для некритичних сповіщень це нормально. Для IoT-алертів — ні.
Потрібен "priority": "high" у FCM payload + на iOS apns-priority: 10 з interruption-level: critical. Останнє — особливий випадок: UNNotificationInterruptionLevel.critical відтворює звук навіть у режимі «Не турбувати» та при ввімкненому беззвучному режимі. Вимагає спеціального entitlement com.apple.developer.usernotifications.critical-alerts, який потрібно окремо запитувати у Apple.
Запит дозволу на критичні сповіщення — окремий промпт, відрізняється від стандартного:
UNUserNotificationCenter.current().requestAuthorization(
options: [.alert, .sound, .badge, .criticalAlert]
) { granted, error in ... }
Користувач має явно дозволити критичні сповіщення — не можна ввімкнути їх без згоди.
Як забезпечити доставку алерту при нестабільному інтернеті?
Для безперервного зв'язку з датчиками використовуємо MQTT — легкий протокол з QoS 1. Це гарантує, що повідомлення буде доставлено хоча б один раз. На сервері додатково впроваджено механізм підтверджень: якщо клієнт не отримав алерт, повторюємо відправку з експоненційною затримкою до 5 хвилин. При цьому критичні сповіщення дублюються через SMS-шлюз (Twilio або аналог), щоб забезпечити максимальну надійність.
Як влаштований IoT pipeline?
Датчики → MQTT-брокер (Mosquitto або AWS IoT Core) → серверний обробник → FCM/APNs.
MQTT — де-факто стандарт для IoT: легкий протокол, працює при нестабільному з'єднанні, підтримує QoS 0/1/2. Датчики публікують дані в топік sensors/{device_id}/temperature, сервер підписується на всі топіки пристроїв користувача.
Серверний обробник при отриманні повідомлення перевіряє значення проти порогових правил:
const rules = await getRulesForDevice(deviceId);
for (const rule of rules) {
if (rule.condition(value)) {
await sendCriticalAlert(userId, {
sensor: deviceId,
metric: rule.metric,
value,
threshold: rule.threshold,
severity: rule.severity
});
}
}
Дедуплікація обов'язкова. Якщо датчик шле дані кожні 10 секунд і температура тримається вище порогу 30 хвилин — це не 180 сповіщень, а одне з оновленням статусу. Redis: SET alert:{device}:{metric}:active 1 EX 1800 — поки ключ існує, нові алерти за цією умовою не надсилаємо.
Порівняння каналів доставки критичних сповіщень
| Канал |
Затримка |
Надійність |
Особливості |
| FCM high priority |
<2 сек |
Висока |
Потребує priority:high |
| APNs critical |
<1 сек |
Максимальна |
Окремий entitlement |
| SMS |
5-30 сек |
Середня |
Альтернативний канал |
| Email |
1-10 хв |
Низька |
Для аналітики |
APNs critical alerts доставляються в 5 разів швидше стандартних push-сповіщень. Для критичних датчиків (CO, температура>45°C) використовуємо комбінацію push + SMS. Надійність гарантується до 99,9% при правильному налаштуванні.
Багаторівнева система алертів
| Рівень |
Приклад |
FCM priority |
iOS level |
Дія |
| Info |
Батарея датчика 20% |
normal |
passive |
У шторці |
| Warning |
Температура >35°C |
high |
active |
Будить екран |
| Critical |
Температура >45°C |
high |
critical |
Звук у беззвучному |
| Emergency |
Датчик CO >200 ppm |
high |
critical |
Звук + вібрація |
На Android аналогічно через notification channels з різним importance: IMPORTANCE_DEFAULT, IMPORTANCE_HIGH, IMPORTANCE_MAX.
Мобільний додаток: екран моніторингу
Dashboard з live-даними датчиків — реалізуємо через WebSocket з'єднання (не polling, щоб бачити оновлення в реальному часі при відкритому додатку). На Flutter: web_socket_channel пакет, дані в Riverpod StreamProvider.
Історичні графіки — fl_chart або syncfusion_flutter_charts. Зберігання історії на сервері в InfluxDB або TimescaleDB (PostgreSQL extension) — обидва оптимізовані для часових рядів.
Налаштування порогових правил у додатку: користувач вибирає датчик, метрику, оператор (>, <, ==), значення, рівень критичності. Правила зберігаються на сервері.
Що входить в роботу
- Проектування схеми MQTT-топіків і вибір брокера (Mosquitto / AWS IoT Core / VerneMQ)
- Розробка серверного обробника з дедуплікацією та експоненційною затримкою
- Налаштування FCM high priority та APNs critical alerts із запитом entitlement
- Реалізація мобільного клієнта (dashboard, WebSocket, налаштування правил, історія інцидентів)
- Інтеграція з SMS-шлюзом (Twilio або аналог) для аварійних алертів
- Документація з інтеграції та навчання персоналу
- Тестування в сценаріях: Doze Mode, «Не турбувати», низький заряд батареї
- Підтримка після запуску (2 тижні моніторингу)
Як отримати entitlement від Apple
Для запиту critical-alerts entitlement потрібно відправити форму в Apple Developer Support, описавши сценарій використання. Процес займає 1-2 тижні. Ми супроводжуємо заявку та допомагаємо підготувати обґрунтування.
Досвід команди
Ми виконали понад 50 проектів у сфері IoT та мобільної розробки. Сертифіковані спеціалісти з Swift, Kotlin та Flutter. Гарантуємо SLA доставки алертів — 99,9% при виконанні рекомендацій. Замовте консультацію за вашим проектом — ми оцінимо терміни та обсяг робіт. Зв'яжіться з нами — отримайте оцінку вартості індивідуально.
Процес розробки
- Аналітика: аудит поточної IoT-інфраструктури та вимог
- Проектування: схема топіків, вибір брокера, архітектура обробника
- Реалізація: серверний обробник + мобільний клієнт (паралельно)
- Тестування: модульне, інтеграційне, навантажувальне (до 10000 датчиків)
- Деплой: налаштування CI/CD, моніторинг (Prometheus + Grafana)
Інвестиції в розробку окупаються в середньому за 3-6 місяців. Зв'яжіться з нами для точної оцінки вашого проекту — отримайте консультацію безкоштовно.
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-type — alert, 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 або кастомному бекенді становить індивідуальну суму залежно від складності фільтрів.
Нормальна сегментація будується на кількох рівнях.
| Тип сегментації |
Інструмент |
Приклад |
| За темами |
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 на подію відкриття. Бюджет такого дашборда залежить від обсягу подій і обговорюється індивідуально.
Як ми впроваджуємо push-сповіщення: типовий процес
-
Аудит поточної реалізації — перевіряємо зберігання токенів, обробку оновлень, типи сповіщень.
-
Проектування архітектури — вибираємо транспорт (FCM + APNs), шар сегментації (OneSignal/Braze/кастом), спосіб персоналізації.
-
Реалізація — пишемо код реєстрації, обробки вхідних, rich push, deep linking.
-
Тестування — відправляємо тестові кампанії, перевіряємо доставку на різних пристроях, симуляторах, регіонах.
-
Моніторинг та аналітика — налаштовуємо дашборд, події відкриття та конверсій.
-
Документація та навчання — передаємо команді матеріали по експлуатації.
Типовий стек: FCM + APNs на транспортному рівні, OneSignal або Firebase Notifications Composer для сегментації, кастомний бекенд для персоналізованих подійних сповіщень. Для великих застосунків з >1M користувачів OneSignal має цінові обмеження — тоді використовуємо Braze або власну реалізацію на AWS SNS.
Що входить у роботу (deliverables)
-
Документація — архітектурна схема push-потоків, інструкція для розробників, опис сегментів
-
Кодова база — репозиторій з реалізацією реєстрації, обробки, rich push, deep linking
-
Доступи — налаштовані проектні конфігурації в Firebase Console, App Store Connect, OneSignal/Braze
-
Дашборд — аналітика доставки та відкриттів (Amplitude або Mixpanel)
-
Навчання команди — воркшоп 2 години з поясненням особливостей експлуатації
Типові помилки, яких варто уникнути
- Не зберігати оновлені
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-сповіщень у мобільному застосунку — ми зв'яжемося з вами протягом дня та надамо точну оцінку.