문서

푸시 알림

앱이 닫혀 있는 동안에도 상담원 답장과 캠페인을 전달하고, 올바른 대화로 곧장 이어지는 딥 링크를 함께 제공하세요. 앱이 푸시 서브시스템을 소유하고, SDK는 토큰을 등록하고 대화를 엽니다.

Respondo가 보내는 것#

  • 메시지 푸시 — 방문자가 참여 중인 대화에서의 상담원 또는 AI 답장.
  • 캠페인 푸시 — 아웃바운드 푸시 캠페인으로, 오픈 비콘도 함께 보고합니다.

메시지 푸시는 항상 respondo://conversation/<id>형태의 딥 링크를 담고 있습니다. 캠페인 푸시는 캠페인에 구성된 딥 링크를 담습니다 — 선택 사항이며, 설정되지 않은 경우 푸시에는 딥 링크가 없습니다.

Apple (APNs)#

iOS 푸시는 Firebase 의존성 없이 APNs에서 직접 동작합니다. Apple Developer 계정에서 다음을 확보하세요:

  • APNs Auth Key(.p8 토큰 키).
  • 해당 키의 Key ID.
  • 여러분의 Team ID.
  • 앱 bundle id.

Google (FCM)#

Android 푸시는 Firebase Cloud Messaging을 거칩니다. Firebase 프로젝트에서 다음을 확보하세요:

  • Cloud Messaging 역할이 있는 서비스 계정 JSON.
  • Firebase 프로젝트 ID(Firebase 콘솔 → 프로젝트 설정) — 대시보드 푸시 폼에서 서비스 계정 JSON과 함께 별도 필드로 입력합니다.
  • Android 앱 패키지 이름, 그리고 앱을 동일한 Firebase 프로젝트에 연결하세요(google-services.json).

Respondo에서 설정하기#

대시보드에서 위젯 채널에 APNs 키와, FCM 서비스 계정 및 그 프로젝트 ID를 추가하세요. Respondo가 두 플랫폼 모두로 전송하는 데 필요한 것은 그게 전부입니다.

API로 자격 증명을 설정하는 방법과 전체 필드 참조는 SDK 액세스와 함께 제공되는 푸시 설정 가이드에서 다룹니다.

페이로드 형식#

페이로드는 항상 루트 respondo 키 아래에 존재합니다 — 이 키의 존재 여부로 SDK는 자신의 푸시와 다른 푸시를 구분합니다(iOS에서는 userInfo에, Android에서는 data["respondo"]의 JSON 문자열로).

respondo payloadjson
{
  "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"
  }
}

모든 값은 평평한 문자열입니다. 알림 제목과 본문은 플랫폼 전송 계층 — APNs의 aps.alert와 FCM의 message.notification — 으로 전달되며, respondo 객체 안에 있지 않습니다.

캠페인 푸시는 오픈 비콘을 보고하는 데 사용되는 delivery_id도 포함하며, 캠페인의 푸시 데이터에서 오는 추가 평면 문자열 키를 담을 수 있습니다.

탭 및 포그라운드 처리#

알림을 탭하면 원시 페이로드를 SDK에 넘기세요. SDK가 페이로드를 파싱해 올바른 대화를 열고, 해당 푸시가 Respondo 푸시가 아니면 false를 반환합니다(그 경우 직접 처리하세요).

탭 처리(플랫폼별)text
Android:  RespondoPushPayload.from(data)?.let { Respondo.handlePush(it) }
iOS:      Respondo.handlePush(userInfo: userInfo)
Flutter:  Respondo.handlePushData(message.data)

중복은 message_id로 합쳐지며, 같은 대화가 포그라운드에서 열려 있는 동안에는 시스템 알림이 억제됩니다 — SDK가 둘 다 자동으로 처리합니다.

디바이스 토큰 등록#

앱은 자신의 푸시 서브시스템에서 디바이스 토큰을 얻어 setPushToken에 전달합니다. 로그아웃 시에는 clearPushToken을 호출하세요.

어떤 토큰을 전달할지. 백엔드는 각 전달을 플랫폼별로 라우팅합니다 — iOS는 APNs로 직접, Android는 FCM으로 — 따라서 여러분의 푸시 라이브러리가 반환하는 아무 토큰이 아니라 그 플랫폼의 네이티브 전송 계층의 토큰을 등록해야 합니다:
  • Android — FirebaseMessaging.getToken()에서 얻은 FCM 등록 토큰.
  • iOS (네이티브) — didRegisterForRemoteNotificationsWithDeviceToken에서 얻은 APNs 디바이스 토큰(16진수).
  • Flutter를 통한 iOS(firebase_messaging) — getToken()이 아니라 getAPNSToken()을 사용하세요. iOS에서 FCM 토큰을 전달하면 그것이 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);
}