Security Lab

Как работают push-уведомления и почему приходят при закрытом приложении

1829
Как работают push-уведомления и почему приходят при закрытом приложении

Смахнули Telegram из списка недавних приложений, заблокировали телефон, положили в карман. Через минуту смартфон завибрировал. Первая мысль вполне понятная. Если приложение закрыто, кто получил сообщение? Обычно ответ связан с отдельной службой доставки push, которая поддерживает связь независимо от открытого окна мессенджера. Для показа уведомления держать весь Telegram на экране или непрерывно выполнять его код не требуется.

Push-уведомление приходит по инициативе сервера, когда произошло событие. На Android с сервисами Google многие приложения используют Firebase Cloud Messaging, или FCM. На iPhone системную доставку обеспечивает Apple Push Notification service, или APNs. Служба принимает сигнал, после чего система показывает карточку либо ненадолго предоставляет приложению возможность обработать данные. Но слово «закрыто» скрывает несколько разных состояний. Убрать окно, освободить память и принудительно остановить приложение далеко не одно и то же.

Я бы начал с простого опыта. Откройте мессенджер, убедитесь, что уведомления разрешены, перейдите на главный экран и заблокируйте телефон. Попросите знакомого прислать сообщение. Затем повторите опыт после удаления карточки приложения из списка недавних. Полученный push доказывает, что доставка в таком состоянии работает. Однако по одной карточке нельзя определить, запускался ли код приложения в фоне и как именно мессенджер получил текст.

Кто приносит сообщение вместо приложения

Представим обычную переписку. Друг нажимает «Отправить», сервер мессенджера принимает сообщение и определяет, каким устройствам адресата нужно сообщить о событии. Телефон мог погасить экран, приостановить приложение или завершить его процесс, освобождая память. Сервер при этом продолжает работать.

Как работают push-уведомления

Чтобы отправить push нужной установке приложения, сервер использует специальный адрес доставки, обычно называемый токеном. Приложение получает такой идентификатор при регистрации в push-системе и передаёт своему серверу. Токен не равен номеру телефона, паролю или постоянному серийному номеру устройства. Токены могут меняться, поэтому разработчик должен обновлять адреса доставки.

Упрощённая цепочка выглядит так.

  1. Друг отправляет сообщение, сервер мессенджера принимает его.
  2. Сервер обращается к push-сервису и передаёт адрес получателя вместе с небольшой порцией данных.
  3. Push-сервис доставляет данные устройству через поддерживаемое соединение.
  4. Система показывает уведомление либо запускает разрешённую обработку, после которой появляется карточка.
  5. По нажатию открывается приложение и при необходимости загружает актуальную переписку с сервера.

Последний пункт часто объясняют слишком категорично, будто push всегда содержит только команду «проснись», а текст приходит исключительно после нажатия. На практике уведомление может уже содержать имя отправителя и фрагмент сообщения. Другой вариант предполагает передачу идентификатора события, по которому приложение запрашивает содержимое. Возможен и зашифрованный пакет, который приложение должно сначала расшифровать.

В FCM различаются сообщения с готовыми полями уведомления и сообщения с данными для обработки приложением. Для первого варианта в фоне предусмотрен автоматический показ в области уведомлений. Второй требует работы кода, а значит, сильнее зависит от ограничений фонового выполнения. Поэтому фраза «Android сам показывает любые push» неверна.

Telegram хорошо иллюстрирует сложность реальных приложений. В документации мессенджера описаны разные push-транспорты, а содержимое FCM-пакета передаётся в зашифрованном виде. Было бы неправильно обещать одну и ту же последовательность обработки для всех версий Telegram, операционных систем и вариантов установки. Общий принцип сохраняется, но готовая карточка не обязательно приходит из облака целиком.

Push также не равен любой всплывающей карточке. Напоминание, заранее запланированное на устройстве, может появиться без нового обращения к серверу. Таймер способен сработать без интернета. Внешне локальное уведомление и удалённый push похожи, но источник события разный.

Что на самом деле означает «закрыть приложение»

Список недавних приложений часто принимают за диспетчер работающих процессов. Однако карточка прежде всего помогает вернуться к предыдущему экрану. По наличию карточки нельзя уверенно судить о расходе процессора, а по отсутствию нельзя заключить, что система запретила приложению любую активность.

Действие Что происходит с уведомлениями
Перейти на главный экран или заблокировать телефон Обычный сценарий для push. Приложение уходит в фон, доставка может продолжаться.
Система завершила процесс ради свободной памяти Отсутствие процесса само по себе не отменяет возможность получить удалённое уведомление.
Смахнуть карточку на Android Обычно удаляется задача из списка недавних. Последствия для фоновой работы зависят от приложения и прошивки.
Нажать «Остановить» в настройках приложения Android Приложение переходит в принудительно остановленное состояние. Для возобновления FCM-доставки нужно снова открыть приложение.
Смахнуть приложение в переключателе на iPhone Приложение принудительно завершается. Нельзя рассчитывать на его фоновый запуск по тихому push до повторного открытия.
Запретить уведомления Запрещается обычный показ карточек. Учётная запись и данные на сервере продолжают существовать.

На iPhone особенно легко перепутать видимое уведомление и тихий push. Первый предназначен для пользователя, второй просит систему дать приложению время на обновление данных без баннера. Apple не гарантирует доставку фоновых уведомлений и может ограничивать их частоту. После принудительного закрытия на такой фоновый запуск рассчитывать нельзя. При этом показ системного уведомления с текстом и выполнение кода основного приложения остаются разными механизмами. Поэтому обещания «после смахивания все push обязательно исчезнут» и «смахивание вообще ни на что не влияет» одинаково неточны.

С запретом фоновой работы похожая история. Переключатель обновления контента на iPhone не служит общим выключателем APNs. На Android ограничения батареи способны мешать обработке данных и дополнительным сетевым запросам, но не всякая карточка требует такой работы. Отсюда знакомая ситуация, когда фон ограничен, а уведомления всё равно появляются. Иногда система соблюдает запрет, просто сообщение проходит по другому предусмотренному пути.

Если хочется тишины, я бы использовал настройки уведомлений. Принудительная остановка решает другую задачу и может лишить приложение нужных событий. Можно отключить уведомления целиком, а при наличии отдельных категорий убрать рекламу, сохранив личные сообщения или оповещения об операциях. Набор категорий задаёт разработчик.

Почему после запрета уведомлений новая переписка появляется при следующем открытии? Потому что разрешение на карточки не управляет хранением сообщений на сервере. Приложение открывает соединение, проходит проверку учётной записи и запрашивает изменения. Даже полная потеря конкретного push не обязана приводить к потере самого сообщения. Хорошо спроектированный сервис использует push как сигнал об изменениях, а актуальные данные получает при синхронизации.

Почему общий канал экономит батарею, но не гарантирует доставку

Представьте 150 приложений, каждое из которых каждые полминуты спрашивает свой сервер, не случилось ли чего-нибудь. Даже пустые ответы требуют сетевого обмена, работы процессора и периодической активности радиомодуля. Отдельные постоянные соединения тоже приходится обслуживать и восстанавливать после смены сети.

FCM позволяет приложениям разделять общее постоянное соединение с облачной инфраструктурой. На Android с сервисами Google соответствующий транспорт обслуживает инфраструктура Google Play services. У Apple системная служба аналогично принимает сообщения через APNs. Телефону не требуется держать отдельный канал ожидания push для каждой установленной программы.

Речь именно о доставке уведомлений, а не обо всех соединениях смартфона. Открытый мессенджер может напрямую обмениваться данными со своими серверами, видеозвонок передаёт медиапоток, музыкальное приложение загружает звук. Кроме того, Android не сводится к сервисам Google. Существуют другие push-сервисы и собственные механизмы приложений. Если Google Play services отсутствуют, работоспособность уведомлений зависит от того, какие альтернативы предусмотрел разработчик.

Экономия возникает благодаря меньшему числу независимых проверок и пробуждений. Но бесплатной по энергии доставка не становится. Получить пакет, расшифровать данные, включить экран и запустить вибрацию тоже стоит заряда. Сотни ненужных уведомлений способны свести часть пользы на нет.

Кроме того, система распоряжается временем доставки. Режим Doze на Android ограничивает фоновую сеть, когда устройство долго простаивает. Обычные сообщения FCM могут ждать выхода из такого состояния. Высокий приоритет предусмотрен для срочных событий, заметных пользователю, но не даёт разработчику права бесконечно будить телефон для рекламы или скрытой работы.

На стороне push-сервисов тоже нет обещания доставить каждое событие немедленно и навсегда сохранить очередь. У сообщений бывает срок жизни. Некоторые обновления могут заменять предыдущие, чтобы после восстановления связи показать актуальное состояние, а не десятки устаревших карточек. Подтверждение приёма запроса сервером FCM или APNs ещё не доказывает, что пользователь увидел уведомление.

Я бы не считал отсутствие банковского push доказательством отсутствия операции. Надёжнее открыть приложение самостоятельно и проверить историю. Уведомление помогает заметить событие, но не заменяет сведения в банковской системе.

От SMS push отличается прежде всего способом доставки и адресацией. SMS обслуживает операторская инфраструктура, сообщение направляется на телефонный номер и обычно может прийти при выключенных мобильных данных. Push требует интернет-соединения с соответствующей службой, зато способен работать через Wi-Fi без SIM-карты, если приложение уже настроено. У SMS существуют варианты доставки через Wi-Fi Calling, поэтому формула «SMS всегда идёт только через вышку» тоже слишком грубая.

Приватность зависит от содержимого пакета. Защищённое соединение с push-сервисом само по себе не означает сквозное шифрование текста. Разработчик может передавать обычный текст, шифровать полезную нагрузку либо отправлять только сигнал для последующей загрузки. Для пользователя самый доступный способ сократить случайное раскрытие переписки и банковских сведений состоит в отключении предпросмотра на заблокированном экране.

Как уведомляет закрытая вкладка и где искать причину задержек

У сайтов есть Web Push. После разрешения пользователя браузер создаёт подписку, а сайт получает адрес, по которому может отправлять события. Для классической схемы используется service worker, отдельный сценарий JavaScript с жизненным циклом, независимым от открытой страницы.

Браузер способен запустить такой обработчик при поступлении push, даже если вкладка сайта давно закрыта. Сценарий получает событие и запрашивает показ уведомления. Постоянно работать в памяти service worker не обязан. Браузер запускает обработчик по необходимости и завершает после работы.

Но закрытая вкладка, закрытое окно и полностью завершённый браузер снова означают разные состояния. Поведение зависит от браузера и операционной системы. Например, в настольном Firefox соединение с push-службой прекращается при полном закрытии браузера. Поэтому универсальное обещание «сайт уведомит даже при выключенном браузере» неверно. Закрывать вкладку обычно можно, а дальнейшая доставка зависит от конкретной реализации.

На iPhone и iPad поддержка Web Push появилась для веб-приложений, добавленных на домашний экран, начиная с версии системы 16.4. Разрешение запрашивается после действия пользователя, например нажатия кнопки подписки. Просто открыть произвольный сайт в Safari недостаточно, чтобы автоматически подписаться на уведомления.

Если сайт надоел, удалять браузер незачем. Нужно отозвать разрешение на уведомления у конкретного сайта в настройках браузера. Отдельно проверьте системное разрешение для самого браузера. Закрытие вкладки уже выданную подписку не отменяет.

При задержках я сначала разделяю три ситуации. Событие не поступило на телефон, событие пришло, но приложение не смогло его обработать, либо карточку скрыли настройки. На глаз симптомы похожи, поэтому лучше проверять последовательно.

  1. Откройте приложение вручную. Убедитесь, что вход в учётную запись сохранён и новые сообщения вообще загружаются. На Android повторное открытие также нужно после принудительной остановки.
  2. Проверьте разрешение на уведомления. Посмотрите общий переключатель, отдельные категории и настройки внутри приложения. Разрешение на сообщения не обязательно включает звук.
  3. Проверьте режимы тишины. «Не беспокоить», «Фокусирование» и сводка уведомлений на iPhone способны скрывать, заглушать или откладывать оповещения.
  4. Сравните Wi-Fi и мобильную сеть. Если сбой воспроизводится только в одной сети, причина может находиться на пути к push-сервису. Работающий сайт в браузере не доказывает доступность всех нужных соединений.
  5. Посмотрите ограничения батареи и фоновых данных. Особенно если сообщения появляются пачкой после открытия приложения. Проверяйте настройки конкретной программы, не отключая экономию для всего телефона.
  6. Проверьте обновления и сообщения о сбоях сервиса. Ошибка регистрации устройства или проблема на сервере приложения тоже может нарушить доставку.

Названия разделов отличаются между версиями Android и оболочками производителей. Я не советую сразу очищать данные или переустанавливать банковское приложение. Можно потерять доступ к текущей сессии и столкнуться со сложным повторным входом, так и не устранив сетевую причину.

Описанные проверки предназначены для собственных устройств и законного использования. Соблюдайте законы своей страны, особенно России, и правила сервисов. Не применяйте механизмы уведомлений для несанкционированного доступа, слежки или незаконного обхода блокировок.

Мой вывод простой. Карточка от закрытого приложения не доказывает, что программа непрерывно работает в фоне. Часто телефон получает событие через общую службу доставки, а приложение подключается к обработке лишь при необходимости. Для тишины управляйте разрешениями, для надёжной связи проверяйте ограничения и сеть, а значимые события сверяйте внутри самого сервиса. Удаление карточек из списка недавних не заменяет ни одного из этих действий.

push-уведомление Android iphone Telegram FCM APNs Web Push фоновая работа
Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
01001
SOC
Security Vision SIEM
Контроль, аналитика и реагирование для SOC.
Больше интеграций. Меньше сложных доработок.
УЗНАТЬ БОЛЬШЕ
18+. Реклама. Рекламодатель ООО «Интеллектуальная безопасность», ИНН 7719435412