RuStore Push SDK: интеграция push-уведомлений в Android-приложение

Разработчики, публикующие приложения в RuStore, часто обнаруживают, что привычный Firebase Cloud Messaging не доставляет уведомления на часть устройств без сервисов Google — и именно для этого сценария создан RuStore Push SDK. Библиотека позволяет отправлять push-уведомления через инфраструктуру RuStore, независимо от наличия Google Play Services на устройстве пользователя.

В этой статье разберём, как работает SDK, как подключить его к проекту, получить токен устройства, отправить тестовое уведомление и исправить типичные ошибки интеграции. Материал ориентирован на Android-разработчиков, использующих Kotlin или Java.

Что такое RuStore Push SDK и когда он нужен

RuStore Push SDK — это клиентская библиотека от VK, которая обеспечивает приём push-уведомлений в приложениях, распространяемых через магазин RuStore. Она работает по схожему с FCM принципу: приложение регистрируется в push-сервисе, получает уникальный токен устройства, а сервер разработчика использует этот токен для отправки сообщений через API RuStore.

Интеграция становится необходимой в нескольких ситуациях. Во-первых, если ваша аудитория использует устройства без сервисов Google — например, смартфоны Huawei и Honor новых поколений. Во-вторых, если RuStore является основным или единственным каналом дистрибуции приложения. В-третьих, если требуется резервный канал доставки уведомлений на случай сбоев FCM.

  • 📱 Доставка уведомлений на устройства без Google Mobile Services
  • 🔄 Работа параллельно с FCM как резервный канал
  • 📊 Поддержка data- и notification-сообщений
  • 🛠 Официальная поддержка со стороны команды RuStore

Подготовка: регистрация проекта в консоли RuStore

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

Порядок действий выглядит так. Войдите в консоль разработчика RuStore, откройте раздел, связанный с push-уведомлениями, и привяжите приложение по его applicationId (имени пакета). После создания проекта вам будут доступны идентификатор проекта и ключи для серверной авторизации — сохраните их в защищённом месте, они понадобятся на стороне бэкенда.

⚠️ Внимание: имя пакета приложения в консоли должно точно совпадать с applicationId в файле build.gradle. Несовпадение даже в одном символе приведёт к ошибке регистрации токена, и диагностировать её бывает непросто.

Подключение SDK к проекту

Библиотека распространяется через репозиторий Maven, который нужно добавить в конфигурацию проекта. Откройте файл settings.gradle или корневой build.gradle и убедитесь, что репозиторий RuStore указан в блоке repositories. Точный актуальный адрес репозитория и номер последней версии SDK стоит брать из официальной документации RuStore — они могут меняться от версии к версии.

Затем добавьте зависимость в файл build.gradle уровня модуля приложения:

dependencies {

implementation "ru.rustore.sdk:pushclient:<версия>"

}

После синхронизации проекта инициализируйте SDK в классе Application вашего приложения. Инициализация обычно выполняется в методе onCreate() и требует передачи контекста и идентификатора проекта, полученного в консоли. Конкретную сигнатуру методов сверяйте с документацией вашей версии SDK — API может отличаться между релизами.

☑️ Проверка подключения SDK

Выполнено: 0 / 5

Получение push-токена и обработка сообщений

Токен — это идентификатор конкретного устройства, по которому сервер отправляет уведомления. Вам нужно запросить его через API SDK, сохранить и передать на свой бэкенд. Важный нюанс: токен может обновляться — при переустановке приложения, очистке данных или по внутренним причинам сервиса. Поэтому недостаточно получить его один раз при первом запуске.

Для приёма сообщений необходимо реализовать сервис-обработчик, унаследованный от класса, предоставляемого SDK (аналог FirebaseMessagingService). В нём переопределяются колбэки: получение нового токена, приём сообщения, ошибки доставки. Этот сервис нужно объявить в AndroidManifest.xml с соответствующим intent-фильтром — без этого система не сможет доставлять в него события.

  • 🔑 Запрашивайте токен при каждом запуске приложения и сравнивайте с сохранённым
  • 📡 Отправляйте обновлённый токен на свой сервер сразу после изменения
  • 🧩 Обрабатывайте оба типа сообщений: уведомления и data-сообщения
  • 🗑 Предусмотрите удаление токена при выходе пользователя из аккаунта
📊 На каком этапе интеграции RuStore Push SDK вы сейчас находитесь?
Только изучаю документацию
Подключаю SDK к проекту
Настраиваю серверную отправку
Отлаживаю ошибки доставки

Отправка уведомлений с сервера

Клиентская часть — только половина работы. Для отправки уведомлений ваш бэкенд должен обращаться к push-API RuStore, авторизуясь с помощью ключей, выданных в консоли. Запрос обычно содержит токен целевого устройства, заголовок, текст сообщения и произвольные данные в поле payload.

Структурно процесс выглядит так: ваш сервер получает от приложения токен, сохраняет его в базе с привязкой к пользователю, а при наступлении события (новое сообщение, акция, напоминание) формирует HTTPS-запрос к API RuStore. Формат запроса и параметры авторизации подробно описаны в официальной документации — используйте именно её как источник истины, поскольку API может обновляться.

Почему нельзя отправлять push прямо с устройства

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

Типичные ошибки и их диагностика

Чаще всего проблемы возникают не в коде, а в конфигурации. Если уведомления не приходят, начните проверку с самого простого: пришёл ли токен на устройство и дошёл ли он до вашего сервера. Отсутствие токена почти всегда означает проблему инициализации SDK или несовпадение идентификаторов проекта.

СимптомВероятная причинаЧто проверить
Токен не выдаётсяНеверный projectId или applicationIdСовпадение с данными консоли RuStore
Токен есть, push не приходитОшибка в серверном запросеКод ответа API и формат payload
Push приходит, но не показываетсяНет разрешения на уведомления (Android 13+)Запрос runtime-разрешения POST_NOTIFICATIONS
Работает на части устройствОграничения фоновой работы прошивкиНастройки автозапуска и батареи на устройстве
Ошибка после обновления SDKИзменение API между версиямиChangelog и миграционный гид в документации
⚠️ Внимание: начиная с Android 13, показ уведомлений требует runtime-разрешения POST_NOTIFICATIONS. Если приложение его не запросило, система молча скроет все push-сообщения, хотя с технической стороны доставка будет работать исправно. Это одна из самых частых причин «пропавших» уведомлений на новых устройствах.

Совместимость с FCM и другими push-сервисами

RuStore Push SDK можно использовать параллельно с Firebase Cloud Messaging и другими push-провайдерами (например, HMS Push Kit для устройств Huawei). Типовая архитектура выглядит так: приложение регистрируется во всех доступных сервисах, собирает токены от каждого и передаёт их на сервер, а бэкенд выбирает подходящий канал доставки в зависимости от устройства.

Чтобы избежать дублирования уведомлений, сервер должен отправлять сообщение только через один канал для каждого устройства. Логика выбора обычно строится на признаках: есть ли на устройстве Google Services, какой токен был получен последним, через какой магазин установлено приложение. Простой и надёжный вариант — хранить для каждого устройства приоритетный канал и обновлять его при смене токенов.

Тестирование перед релизом

Перед публикацией сборки в RuStore прогоните полный цикл: установка приложения, получение токена, отправка тестового уведомления, открытие уведомления и переход на нужный экран. Проверять стоит минимум на двух устройствах — с сервисами Google и без них, поскольку поведение фоновых процессов может отличаться.

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

Как логировать работу SDK при отладке

Оберните все колбэки SDK (получение токена, приём сообщения, ошибки) в логирование через Logcat с отдельным тегом, например RuStorePush. В debug-сборках можно выводить токен и содержимое payload в лог — это сильно ускоряет поиск проблем. В release-сборке логирование чувствительных данных отключите.

Часто задаваемые вопросы

Работает ли RuStore Push SDK на устройствах с Google Services?

Да, SDK функционирует независимо от наличия Google Mobile Services. На устройствах с GMS можно использовать FCM и RuStore Push параллельно, выбирая канал доставки на серверной стороне.

Обязательно ли публиковать приложение в RuStore, чтобы использовать push-сервис?

Push SDK ориентирован на приложения, распространяемые через RuStore, и требует регистрации проекта в консоли разработчика RuStore. Актуальные условия использования уточняйте в официальной документации сервиса.

Что делать, если токен перестал приходить после обновления SDK?

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

Можно ли отправлять уведомления по топикам, как в FCM?

Возможности сегментации и рассылки по темам зависят от текущей версии API RuStore. Сверяйтесь с официальной документацией: если топики не поддерживаются, групповую рассылку можно реализовать на своём сервере, итерируясь по списку токенов целевой аудитории.

Почему уведомления приходят с задержкой на некоторых устройствах?

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