Что такое топики в Firebase Push Notifications
Что проверяют
Знаете ли вы способы адресации push в Firebase Cloud Messaging и когда групповая рассылка уместнее адресной. За вопросом стоит практика: кто выбирает аудиторию, клиент или бэкенд, что происходит с подпиской при смене токена.
Как отвечать
Топик это именованный канал: клиент подписывается на него сам, сервер отправляет одно сообщение, FCM разносит его всем подписчикам. Способов адресации три: токен устройства, группа устройств и топик.
Firebase.messaging.subscribeToTopic("sport")
.addOnCompleteListener { task -> if (!task.isSuccessful) scheduleRetry() }Что стоит проговорить по делу:
- подписка привязана к токену экземпляра приложения, а не к аккаунту; переустановка или сброс токена подписку теряет;
- отправлять можно на имя топика или на условие, которое комбинирует несколько топиков логическими операторами, число топиков в условии ограничено;
- рассылка это фанаут: доставка по большой аудитории размазана по времени, гарантий «всем одновременно» нет;
- подписаться на любой топик может любая копия приложения, авторизация тут не участвует.
Отсюда вывод для собеседования: топики хороши для сегментов (город, категория новостей, версия приложения), а личные уведомления идут по токену, который хранится на сервере рядом с пользователем.
Где спотыкаются
Делают топик на каждого пользователя и считают это адресной доставкой. Подписка со стороны клиента ничем не защищена, поэтому в такой канал нельзя класть ни персональные данные, ни то, что видно только владельцу аккаунта. Личное отправляется по токену, а массовое по топику.
Подписываются один раз при первом запуске и не обрабатывают неудачу. Вызов асинхронный и в офлайне падает, а при обновлении токена в onNewToken набор подписок нужно восстановить. Из-за этого часть аудитории тихо перестаёт получать рассылки, и выглядит это как «топики не работают».
Путают проблему доставки с проблемой отображения. Если сервер шлёт notification, в фоне уведомление рисует система и обработчик в приложении не вызывается, а без корректного канала уведомлений оно вообще не показывается. Прежде чем винить топик, стоит проверить тип полезной нагрузки и настройки канала.