Android SDK
Respondo 지원 채팅을 앱 위의 바텀 시트로 여는 얇은 Kotlin 및 Jetpack Compose 클라이언트입니다.
요구 사항#
minSdk24(Android 7.0), compileSdk 35.- Kotlin 2.x와 Jetpack Compose(SDK는 Compose UI를 함께 제공합니다).
- JVM 타깃 17.
SDK는 자체 전이 의존성(Coroutines, kotlinx.serialization, OkHttp, Coil, Compose)을 가져오고 매니페스트에 INTERNET 권한을 선언합니다 — 손으로 추가할 것은 없습니다.
설치#
라이브러리는 Maven Central에 ai.respondo:respondo-sdk로 게시되어 있습니다. mavenCentral()이 저장소에 포함되어 있는지 확인한 뒤(새 Android 프로젝트에서는 기본으로 포함됩니다), 좌표로 의존성을 추가하세요.
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
}dependencies {
implementation("ai.respondo:respondo-sdk:0.1.0")
}초기화#
Respondo.init을 한 번 호출하고, Compose 트리에 RespondoChatHost()를 한 번 마운트한 뒤, 여러분의 버튼에서 채팅을 여세요.
import ai.respondo.sdk.Respondo
import ai.respondo.sdk.RespondoConfig
import ai.respondo.sdk.ui.RespondoChatHost
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Respondo.init(
context = this,
config = RespondoConfig(
agentId = "<agent-uuid>", // 대시보드에서 확인
channelId = "<channel-uuid>", // 선택 사항
// baseUrl 생략 -> https://api.respondo.ai
),
)
setContent {
MaterialTheme {
Box(modifier = Modifier.fillMaxSize()) {
Button(onClick = { Respondo.open() }) { Text("Support") }
RespondoChatHost() // 채팅 상태가 OPEN이면 SDK가 시트를 표시
}
}
}
}
}모든 호출은 Respondo 싱글턴을 통과합니다. 멱등적이고 어느 스레드에서든 안전하며, init이 끝나기 전에 이루어진 호출은 버퍼링되었다가 다시 재생됩니다.
사용자 식별#
기본적으로 모든 방문자는 익명입니다. 첫 실행 시 SDK는 안정적인 visitor_id를 생성해 로컬 스토리지에 보관하므로, 다시 방문한 사용자는 자신의 대화를 다시 찾습니다. 내장할 API 키는 없습니다 — 각 대화는 백엔드가 발급하고 메시지마다 앞으로 밀어주는 대화별 세션 토큰으로 보호되므로, 익명 방문자는 재인증할 필요가 전혀 없습니다.
사용자가 로그인하면 identify를 한 번 호출하세요. 이렇게 하면 실제 신원이 연결되어 여러 기기와 재설치에 걸쳐 대화 이력이 따라오고, Inbox의 대화 옆에 익명 방문자 대신 이름과 이메일이 표시됩니다.
userHash는 여러분의 백엔드가 에이전트의 identity_secret으로 계산하는 서명입니다 — HMAC-SHA256(secret, userId)(userId가 없으면 이메일), 소문자 16진수로 인코딩합니다. 이 시크릿은 신원이 진짜임을 증명하므로 오직 여러분의 백엔드에만 있어야 하고 앱에 절대 포함되어서는 안 됩니다. 전체 공식과 서버 측 예제는 신원 확인 페이지를 참고하세요.
import ai.respondo.sdk.RespondoIdentity
// userHash는 여러분의 백엔드에서 옵니다(userId에 대한 HMAC-SHA256) —
// 앱에서 절대 계산하지 마세요.
Respondo.identify(
RespondoIdentity(
userId = session.userId,
email = session.email,
name = session.fullName,
userHash = session.respondoUserHash,
),
)
// 로그아웃 시: 푸시 토큰을 제거하고, 세션을 폐기하고, 새 익명 방문자를 시작합니다.
Respondo.clearPushToken()
Respondo.reset()해시가 없거나 잘못되어도 아무것도 예외를 던지지 않습니다: 백엔드는 방문자를 조용히 익명으로 유지하고, 채팅은 계속 동작하며, 유효한 해시가 제공될 때까지 단지 기기 간 연결만 잃을 뿐입니다. 검증은 에이전트에 identity_secret이 설정되어 있을 때만 실행됩니다 — 개발 중에는 비워 두면 userId / 이메일이 있는 그대로 받아들여집니다.
관찰 가능한 값 및 콜백#
상태를 StateFlow로 반응형으로 읽거나(Compose에 적합) RespondoListener를 통해 명령형으로 읽으세요(앱 아이콘 배지에 적합).
// 반응형: 읽지 않은 개수를 StateFlow로.
val unread by Respondo.unreadCount.collectAsState()
// 명령형: 배지와 분석을 위한 리스너.
Respondo.setListener(object : RespondoListener {
override fun onUnreadChanged(count: Int) { updateAppIconBadge(count) }
override fun onUrlRequested(url: String): Boolean = tryOpenInternally(url)
})화면 추적#
능동적 티저와 페이지 수준 타기팅이 대조할 수 있도록 내비게이션마다 현재 화면을 보고하세요. null을 전달하면 지워지며, 변경될 때마다 새 화면에 대해 능동적 티저가 다시 평가됩니다.
Respondo.setCurrentScreen("pricing")