Какие сервисы определяют токены пуш-уведомлений?
Что проверяют
Понимаете ли вы, откуда берётся токен пуш-уведомлений и что с ним происходит в жизни приложения. Тестировщику следом задают практический вопрос: когда токен меняется и как проверить, что пуш дойдёт до нужного устройства.
Как отвечать
Токен выдаёт не ваш бэкенд, а служба доставки платформы:
- APNs: для iOS и macOS. Приложение вызывает
registerForRemoteNotifications()и получает device token в колбэке. Токены песочницы и продакшена разные: сборка из Xcode получает sandbox-токен, TestFlight и App Store работают с продакшеном; - FCM: для Android с сервисами Google. Токен отдаёт
FirebaseMessaging.getInstance().getToken(), смена ловится вonNewToken(). На iOS FCM работает поверх APNs и сам связывает токены; - HMS Push Kit: устройства Huawei без сервисов Google;
- RuStore Push: служба пушей российского магазина приложений для устройств без сервисов Google;
- Web Push: браузер выдаёт через
PushManager.subscribe()с ключами VAPID не токен, а endpoint подписки.
Сервисы-агрегаторы пушей токены не выдают, они работают поверх тех же APNs и FCM.
Цепочка такая: приложение получает токен и отправляет на свой бэкенд, тот хранит связь с пользователем и устройством и шлёт пуш через API платформы. Что проверять:
- токен меняется после переустановки, очистки данных, переноса на новое устройство;
- при логауте токен отвязывается от аккаунта, иначе пуши получит следующий пользователь;
- у одного пользователя бывает несколько устройств;
- сервер удаляет невалидные токены по ответу платформы:
UNREGISTEREDу FCM,410у APNs.
Для ручной проверки подходят тестовая отправка из консоли Firebase и xcrun simctl push для симулятора.
Где спотыкаются
Говорят, что токен генерирует бэкенд, или путают его с токеном авторизации. Это разные сущности с разным жизненным циклом.
Считают токен вечным. Он меняется, и приложение обязано отправлять свежий токен на сервер.
Путают разрешение на уведомления с токеном. На Android 13+ и iOS токен выдаётся и без согласия пользователя, запрет касается только показа уведомлений.