PD Документация ← На главную

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. Установка

bash
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. Инициализация и регистрация

ts
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)

ts
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. Выход пользователя

ts
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). Из своего кода:

ts
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. Проверка

  1. Запустите приложение на устройстве, разрешите уведомления.
  2. Приложения → ваше приложение → Устройства: появилась строка с платформой и вашим user_id.
  3. Отправить уведомление → цель «пользователь» или «устройство» → push приходит; в карточке уведомления растут delivered и opened.
СимптомПроверьте
registration равен nullразрешение выдано; на iOS — capability Push Notifications, физическое устройство
401 unauthorizedpublicKey — ключ 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).