Сделайте историю самостоятельной
Сначала определите, где хранится сообщение и как приложение получает актуальный список. У каждого сообщения должны быть устойчивый идентификатор, принадлежность диалогу и сведения, необходимые для согласованного порядка. Доступ к истории проверяется на стороне доверенного сервиса; идентификатор чата из уведомления не является разрешением читать его содержимое. В учебной архитектуре сервер сохраняет сообщение, затем отправляет сигнал получателю. Приложение синхронизирует историю через обычный защищённый запрос. Повторный сигнал не должен создавать вторую копию уже известного сообщения: локальное обновление сопоставляет записи по идентификатору. Такое поведение нужно спроектировать отдельно, а не ожидать от системы уведомлений.
Учитывайте тип сообщения и состояние приложения
В Firebase Cloud Messaging различаются notification-сообщения и data-сообщения; возможно их сочетание. Поведение зависит от того, находится ли приложение на переднем плане или в фоне. Для notification-сообщений в фоне уведомление обычно обрабатывается системным механизмом, а при активном приложении обработка приходит в код приложения. Поэтому один успешный тест на открытом экране чата недостаточен. Проверяйте свёрнутое приложение, переход по уведомлению и открытие нужного диалога после входа в учётную запись. Обработчик получения сообщения имеет ограниченное время работы; длительные операции не стоит выполнять в нём напрямую. Для подходящих отложенных задач предусмотрен WorkManager.
Не полагайтесь на порядок push-сигналов
FCM не гарантирует порядок доставки. Кроме того, сворачиваемые сообщения могут заменяться более новыми до доставки. Это удобно для сигнала «появились обновления», но опасно, если считать каждое уведомление единственным хранилищем отдельной реплики. Продумайте восстановление после отсутствия сети: при открытии диалога приложение запрашивает недостающую историю независимо от того, сколько уведомлений пришло. Статусы «отправлено», «доставлено» и «прочитано» также требуют собственных определений и подтверждений. Успешная передача запроса сервису push не доказывает, что человек увидел текст.
Проверьте разрешения и приватность
Начиная с Android 13 для обычных уведомлений используется разрешение POST_NOTIFICATIONS. Пользователь может отказать, и основной доступ к переписке должен оставаться понятным без уведомлений. Запрашивайте разрешение в контексте функции, объясняя, что именно оно включает. Не помещайте секреты и лишние персональные сведения в полезную нагрузку. Продумайте, какой текст допустимо показывать на заблокированном экране. Отправка через доверенный сервер позволяет не встраивать серверные полномочия в мобильный клиент. Регистрационные токены устройств требуют актуализации и корректной связи с пользователем, особенно при выходе из аккаунта и его смене.
Попробуйте на практике
Нарисуйте схему учебного чата без реальных пользователей и секретов.
- Покажите путь сообщения от отправителя к серверному хранилищу и получателю. Отдельной стрелкой обозначьте push-сигнал.
- Назначьте условные идентификаторы диалога и сообщения. Опишите, как повторное получение сигнала не создаёт дубликат истории.
- Составьте четыре проверки: приложение открыто, находится в фоне, уведомления запрещены, сеть возвращается после перерыва.
- Опишите переход по уведомлению с проверкой входа и доступа к диалогу. Укажите, какие данные не должны попадать в уведомление.
Как проверить результат. История восстанавливается без зависимости от количества и порядка уведомлений. Повторные сигналы не дублируют сообщения, отказ в разрешении учтён, а доступ проверяется отдельно.
Частые вопросы
Можно ли хранить весь чат только в push-сообщениях?
Для надёжной истории нужен самостоятельный механизм хранения и синхронизации. Push предназначен для доставки сигнала или полезной нагрузки, но не заменяет полноценную модель переписки.
Показ уведомления означает, что сообщение прочитано?
Нет. Статус прочтения определяется логикой приложения, например подтверждённым просмотром соответствующего сообщения. Получение или показ уведомления — другой этап.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.