Какие требования к гарантии доставки обновлений в мобильном приложении, можно ли использовать Firebase сервис или нужен сокет
Что проверяют
Понимаете ли вы, что гарантию доставки не даёт ни FCM, ни сокет и её строят на уровне приложения. Следом спрашивают, что происходит с сообщениями, пока телефон в Doze или без сети, и как клиент узнает о пропущенном.
Как отвечать
Сначала уточните, о каких «обновлениях» речь. Если о новых версиях приложения, это Play In-App Updates (AppUpdateManager, режимы immediate и flexible) плюс проверка минимальной версии с сервера. Если о данных в реальном времени, разбирайте транспорт.
FCM хорош как способ разбудить приложение, но назовите его свойства:
- нет гарантии: сообщение живёт не дольше TTL (максимум 28 суток), а если на устройстве скопилось больше сотни недоставленных несворачиваемых сообщений, FCM их выбрасывает и вызывает
onDeletedMessages(); - Doze и App Standby: обычный приоритет ждёт окна обслуживания, высокий будит устройство, но его понижают, если приложение не показывает по таким сообщениям уведомлений;
- лимиты: полезная нагрузка до 4 КБ, токен меняется и обновляется в
onNewToken; - нет Google Play Services: на части устройств FCM не работает, нужны другие пуш-провайдеры, например RuStore или Push Kit.
Сокет (WebSocket, MQTT) даёт низкую задержку и контроль, но только пока приложение живо. В фоне система ограничивает сеть и убивает процессы, а foreground service ради постоянного соединения требует объявленного типа и обоснования при публикации в Google Play.
Надёжная схема: пуш или сокет лишь сообщают «есть новое», а данные клиент забирает сам по API с курсора, например since=<id последнего события>. Сервер хранит события, клиент применяет их идемпотентно по идентификатору, отложенную синхронизацию доводит до конца WorkManager, а при старте приложения идёт догоняющий запрос.
Где спотыкаются
Отвечают «FCM гарантирует доставку». Это доставка по возможности, и потери надо закладывать в дизайн.
Кладут в пуш сами данные и делают его единственным источником. Потерянный пуш тогда означает потерянные данные.
Предлагают вечный фоновый сокет вместо пушей. На современном Android его убьёт система, а батарею он съест раньше, чем принесёт пользу.