React Native SDK
Пакет @pushdata/react-native регистрирует устройство в PushData по нативному токену (FCM на Android, APNs на iOS), снимает его при выходе и отмечает доставку, открытие и клик. Своего нативного модуля у пакета нет: токен даёт @react-native-firebase/messaging (готовая связка @pushdata/react-native/firebase) или expo-notifications. Работает только с публичным ключом приложения (pk_…), который можно хранить в приложении; отправки и контакты — с вашего сервера, секретным ключом.
Пакет публикуется. Пока@pushdata/react-nativeне появился в npm, установите его из каталогаsdk/react-nativeрепозитория PushData:npm install ../pushdata/sdk/react-native(илиnpm packтам и установка архива). API и шаги руководства те же.
Требования: React Native 0.72+ или Expo SDK 50+ (dev build — Expo Go push не поддерживает), проект Firebase; для iOS — аккаунт Apple Developer и физическое устройство.
1. Ключи приложения
В дашборде откройте Приложения → ваше приложение → Настройки: понадобятся ID приложения и публичный ключ pk_… (раздел «API-ключи»). Секретный ключ pd_… в приложение не попадает.
2. Провайдеры в PushData
- Android → FCM. В Firebase Console создайте проект и Android-приложение с вашим package name, скачайте
google-services.jsonвandroid/app/; Project settings → Service accounts → Generate new private key. В дашборде Приложения → ваше приложение → Провайдеры Push → FCM: Project ID + JSON сервисного аккаунта. - iOS → APNs. В Apple Developer → Keys создайте ключ с APNs, скачайте
.p8, запомните Key ID и Team ID. В дашборде Провайдеры Push → APNs:.p8, Key ID, Team ID, Bundle ID. В Xcode — Push Notifications и Background Modes → Remote notifications. PushData отправляет на iOS напрямую через APNs — SDK регистрирует токен APNs, а не токен FCM.
3. Установка
npm install @pushdata/react-native @react-native-firebase/app @react-native-firebase/messaging @react-native-async-storage/async-storage
cd ios && pod installНастройка @react-native-firebase (плагин google-services, GoogleService-Info.plist, AppDelegate) — по документации React Native Firebase. В Expo используйте плагины @react-native-firebase/app и @react-native-firebase/messaging в app.json и dev build (npx expo prebuild).
4. Инициализация и регистрация
import { PushDataClient } from '@pushdata/react-native'
import { startWithFirebase } from '@pushdata/react-native/firebase'
import AsyncStorage from '@react-native-async-storage/async-storage'
import messaging from '@react-native-firebase/messaging'
import { Platform } from 'react-native'
export const pushData = new PushDataClient({
appId: 'APP_ID', // Приложения → Настройки
publicKey: 'pk_…', // Приложения → Настройки → API-ключи (публичный)
// При включённой проверке идентичности — HMAC id пользователя с вашего сервера (шаг 7):
// identityHashProvider: userId => backend.identityHash(userId),
})
// После входа пользователя (или при старте — для анонимного устройства):
// разрешение, нативный токен, POST /api/v1/public/devices, смена токена, delivered / opened.
const { registration, stop } = await startWithFirebase(pushData, messaging(), {
platform: Platform.OS === 'ios' ? 'ios' : 'android',
userId: 'user-123',
tags: ['news'],
storage: AsyncStorage, // токен запоминается для выхода
})registration — { id, created } или null, если пользователь запретил уведомления. Окружение APNs — sandbox при __DEV__, иначе production (apnsEnvironment переопределяет). stop() — выход пользователя: DELETE /api/v1/public/devices и отписка от событий.
Android 13+: messaging().requestPermission() внутри startWithFirebase показывает системный запрос POST_NOTIFICATIONS.
Expo (expo-notifications)
import * as Notifications from 'expo-notifications'
const { status } = await Notifications.requestPermissionsAsync()
if (status === 'granted') {
const { data: token } = await Notifications.getDevicePushTokenAsync() // APNs на iOS, FCM на Android
await pushData.registerDevice({
token,
platform: Platform.OS === 'ios' ? 'ios' : 'android',
userId: 'user-123',
environment: __DEV__ ? 'sandbox' : 'production',
})
}
Notifications.addPushTokenListener(({ data }) => pushData.registerDevice({ token: data, platform: Platform.OS === 'ios' ? 'ios' : 'android', userId: 'user-123' }))5. Выход пользователя
await stop() // связка с Firebase
await pushData.unregisterDevice(token) // при своём источнике токенаОдин токен — одно устройство: регистрация под другим userId переводит устройство новому пользователю.
6. События
В data каждого push PushData кладёт pushdata_notification_id и pushdata_device_id. startWithFirebase отмечает delivered для сообщений в foreground (onMessage) и opened для тапа (onNotificationOpenedApp, getInitialNotification). Из своего кода:
await pushData.trackMessage('clicked', remoteMessage.data) // no-op, если push не от PushData
await pushData.track('delivered', { notificationId, deviceId })Фоновые сообщения (setBackgroundMessageHandler) — тот же trackMessage('delivered', message.data).
7. Проверка идентичности
При включённой Приложения → Настройки → Проверка идентичности регистрация с userId должна нести заголовок X-Identity-Hash — hex HMAC-SHA256 от id пользователя на секрете идентичности приложения. Секрет не покидает ваш сервер: сделайте авторизованный эндпоинт, который возвращает хэш, и передайте identityHashProvider в PushDataClient (или identityHash в registerDevice). Без него PushData ответит 401 identity_unverified. Анонимным устройствам хэш не нужен.
8. Проверка
- Запустите приложение на устройстве, разрешите уведомления.
- Приложения → ваше приложение → Устройства: появилась строка с платформой и вашим
user_id. - Отправить уведомление → цель «пользователь» или «устройство» → push приходит; в карточке уведомления растут
deliveredиopened.
| Симптом | Проверьте |
|---|---|
registration равен null | разрешение выдано; на iOS — capability Push Notifications, физическое устройство |
401 unauthorized | publicKey — ключ pk_ именно этого приложения |
401 identity_unverified | проверка идентичности включена — задайте identityHashProvider или регистрируйте анонимно |
getAPNSToken() возвращает null | физическое устройство, capability, GoogleService-Info.plist в проекте; повторите через секунду |
| push отправлен, ничего не пришло | ключи у провайдера APNs / FCM от того же приложения и проекта; sandbox для debug, production для TestFlight; устройство ACTIVE |
Ошибки SDK — PushDataError с status и code сервиса (unauthorized, identity_unverified, validation_error, not_found, rate_limited).