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

Если первый маршрут сейчас недоступен, это ещё не означает, что перестал работать второй. Поэтому даже если приложение заблокировано в России, может возникнуть ситуация, когда внутри ничего не обновляется, но Android продолжает получать предназначенные для него push-уведомления через инфраструктуру Google.
Почему сообщение видно, но открыть его нельзя
Получается, недоступность самого приложения не обязательно мешает доставке push-уведомлений. Звучит как магия XXI века, но возможности её ограничены. Через FCM можно передать лишь небольшой объём данных. Его вполне хватит, например, для имени отправителя и короткого сообщения, но не для загрузки переписки с фотографиями и другими вложениями.
Если пользователь нажимает на такое уведомление, запускается сам мессенджер. Чтобы показать сообщение целиком, ему уже нужно получить данные со своего сервера. То есть снова используется первый маршрут: смартфон → сервер мессенджера.
Если соединение не устанавливается, получается абсурдная ситуация: текст нового сообщения в уведомлении есть, а открыть переписку с ним нельзя. Буквально как в меме с рыбами, которые вроде бы есть, но Android их только показывает. Суть проблемы в том, что система получила уведомление одним путём, а приложение пытается открыть его другим.

Firebase Cloud Messaging широко используется на Android, но это не единственный вариант. Разработчики могут построить доставку уведомлений иначе. Кроме того, даже FCM позволяет работать по-разному: одно приложение получает сразу готовый текст уведомления, а другое — только сигнал о новом событии и после этого самостоятельно обращается за подробностями.
Поэтому два приложения на одном телефоне могут вести себя совершенно по-разному. Одно продолжит показывать текст сообщения, другое покажет только «У вас новое уведомление», а третье вообще ничего не сообщит, пока не восстановится необходимое ему соединение.
Вот и весь секрет: получение push-уведомления и загрузка содержимого приложения — две разные и порой независимые друг от друга задачи. Поэтому Android может уже знать о новом сообщении, хотя сам мессенджер в этот момент не способен его показать. Такое вот разделение обязанностей.



















Станьте первым, кто оставит комментарий