Документация

Пуш-уведомления

Доставляйте ответы операторов и кампании, пока приложение закрыто, с диплинком прямо в нужный диалог. Пуш-подсистемой владеет ваше приложение; SDK регистрирует токены и открывает диалоги.

Что отправляет Respondo#

  • Пуши сообщений — ответ оператора или ИИ в диалоге, в котором участвует посетитель.
  • Пуши кампаний — исходящие пуш-кампании, которые также сообщают маячок открытия.

Пуши сообщений всегда несут диплинк вида respondo://conversation/<id>. Пуши кампаний несут диплинк, настроенный в кампании, — он необязателен, и если не задан, пуш не содержит диплинка.

Apple (APNs)#

Пуш на iOS работает напрямую через APNs — без зависимости от Firebase. Из своего аккаунта Apple Developer получите:

  • Ключ APNs Auth Key (токен-ключ .p8).
  • Key ID этого ключа.
  • Ваш Team ID.
  • bundle id приложения.

Google (FCM)#

Пуш на Android идёт через Firebase Cloud Messaging. Из своего проекта Firebase получите:

  • service account JSON с ролью Cloud Messaging.
  • ID проекта Firebase (консоль Firebase → Project settings) — вводится отдельным полем в форме пуша в панели управления рядом с service-account JSON.
  • package name Android-приложения и подключите приложение к тому же проекту Firebase (google-services.json).

Настройка в Respondo#

Добавьте ключ APNs и service account FCM с его ID проекта в канал вашего виджета в панели управления. Это всё, что нужно Respondo, чтобы отправлять на обе платформы.

Задание учётных данных через API и полный справочник полей разобраны в гайде по настройке пуша, который поставляется вместе с доступом к SDK.

Формат payload#

Payload всегда лежит под корневым ключом respondo — по его наличию SDK отличает свой пуш от чужих (на iOS в userInfo, на Android как JSON-строка в data["respondo"]).

payload respondojson
{
  "respondo": {
    "type": "message",
    "conversation_id": "a1c4e7b2-5d38-4f6a-9e10-3b7c2d5f8a90",
    "message_id": "e9a3c1f6-4b8d-4e0a-b5f3-1d7b2a4e9c63",
    "deep_link": "respondo://conversation/a1c4e7b2-5d38-4f6a-9e10-3b7c2d5f8a90"
  }
}

Все значения — плоские строки. Заголовок и текст уведомления доставляются платформенным транспортом — aps.alert в APNs и message.notification в FCM — а не внутри объекта respondo.

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

Обработка тапов и переднего плана#

По тапу на уведомлении передайте сырой payload в SDK. Он разбирает payload и открывает нужный диалог, возвращая false, если это не пуш Respondo (в этом случае обработайте его сами).

Обработка тапа (по платформам)text
Android:  RespondoPushPayload.from(data)?.let { Respondo.handlePush(it) }
iOS:      Respondo.handlePush(userInfo: userInfo)
Flutter:  Respondo.handlePushData(message.data)

Дубли схлопываются по message_id, а пока тот же диалог открыт на переднем плане, системное уведомление подавляется — SDK делает и то, и другое автоматически.

Регистрация токенов устройства#

Ваше приложение получает токен устройства из своей пуш-подсистемы и передаёт его в setPushToken. При выходе вызывайте clearPushToken.

Какой токен передавать. Backend маршрутизирует каждую доставку по платформе — iOS идёт напрямую в APNs, Android идёт в FCM — поэтому вы должны регистрировать токен нативного транспорта платформы, а не то, что вернула ваша пуш-библиотека:
  • Android — регистрационный токен FCM из FirebaseMessaging.getToken().
  • iOS (нативно) — токен устройства APNs (hex) из didRegisterForRemoteNotificationsWithDeviceToken.
  • iOS через Flutter (firebase_messaging) — используйте getAPNSToken(), а не getToken(). Передача FCM-токена на iOS отправляет его в APNs, где он не является валидным токеном устройства, и пуши никогда не приходят. getAPNSToken()может быть null в первые мгновения после запуска — в этом случае повторите попытку после короткой задержки.
Android — FirebaseMessagingServicekotlin
override fun onNewToken(token: String) {
    Respondo.setPushToken(token)
}
iOS — AppDelegateswift
func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    let token = deviceToken.map { String(format: "%02x", $0) }.joined()
    Respondo.setPushToken(token)
}
Flutter — firebase_messagingdart
// iOS нужен APNs-токен; Android нужен FCM-токен.
final token = Platform.isIOS
    ? await FirebaseMessaging.instance.getAPNSToken()
    : await FirebaseMessaging.instance.getToken();
if (token != null) Respondo.setPushToken(token);

// FCM ротирует свой регистрационный токен; держите Android в синхронизации.
if (!Platform.isIOS) {
  FirebaseMessaging.instance.onTokenRefresh.listen(Respondo.setPushToken);
}