Почему UnifiedPush через публичный ntfy на Android дает сбой
Команда мессенджера RCQ — открытый код, сквозное шифрование, Android и iOS — честно разложила на Хабре, почему «красивый» отказ от FCM в пользу UnifiedPush в проде превращается в тыкву.
Илья Рябов, Обозреватель мобильного рынка и охотник за мелким шрифтом·обновлено 01 августа 2026 г.

Уведомления через публичный ntfy.sh не доходят: четыре из пяти попыток разбудить телефон заканчиваются отказом. И так с первого дня работы фичи, а не «что-то сломалось на той стороне».
Где рвётся цепочка
UnifiedPush устроен элегантно на бумаге: ваш сервер делает POST → пуш-сервер отдаёт байты → дистрибьютор на телефоне принимает их через системный бродкаст → приложение получает сигнал. Никакого Google в схеме. Самый популярный пуш-сервер — публичный ntfy.sh, самый популярный дистрибьютор — официальное приложение ntfy. На этой связке по умолчанию стоит почти всё «бесплатное-открытое-без-Google».
А теперь следите за руками. Официальный клиент ntfy из Google Play держит постоянное соединение с ntfy.sh только в сборке с F-Droid. В Play-версии «instant delivery» опциональна — по умолчанию работает через Firebase. Логика авторов ntfy понятная: зачем жечь батарею постоянным сокетом, когда есть FCM.
И вот тут начинается цирк. В регионе, где FCM мёртв (а это Россия, Иран и далее по списку), пользователь ставит ntfy из Play Market. Тот ждёт сигнала через мёртвый Firebase и постоянного канала с ntfy.sh не держит. С точки зрения сервера подписчиков на топике нет. Наш POST получает код 507 — «отказано». Сообщение не кэшируется, не откладывается, не существует.
Цифры из боевого журнала
Срез за 36 часов, только Android-эндпоинты: на одну успешную доставку — больше четырёх отказов. Отказы идут с 15 июня, со дня запуска фичи. Просто на паре тестовых телефонов, которые всегда на связи и в Wi-Fi, это было незаметно — у меня, кстати, тоже: я проверял на Pixel, лежащем на зарядке, всё прилетало за полсекунды. А у живых пользователей в поле — тишина.
Платный тариф ntfy это не лечит. Лимитирование по подписчику срабатывает ровно так же: нет зарегистрированного подписчика на топике — нет доставки, и никакая подписка уровня Pro не воскресит ваш POST.
Что делать, если хочется пушей без Google
Мораль для тех, кто уходит от FCM: «открытый стандарт» без живой инфраструктуры — это не свобода, а тихий отвал уведомлений. Если у вас в регионе FCM не работает, а ntfy стоит из Play Market — у вас сейчас не пуш-сервер, а чёрная дыра: клиент слушает мёртвый Firebase, сервер видит пустой топик и отказывает молча.
Варианты, которые реально работают: ставить ntfy из F-Droid (там постоянное соединение включено по умолчанию), поднимать свой пуш-сервер и свой дистрибьютор, либо вообще не играть в UnifiedPush на публичных инстансах и честно держать свой. В RCQ пошли по последнему пути и написали собственный дистрибьютор — детали в их разборе на Хабре.
Перед тем как раскатывать «свободу от Google» на прод, проверьте на десятке устройств с разными условиями связи: метро, edge, две недели в фоне. Четыре из пяти отказов в логах сервера — это не баг, это и есть поведение публичного ntfy.sh из коробки.