문서

Android SDK

Respondo 지원 채팅을 앱 위의 바텀 시트로 여는 얇은 Kotlin 및 Jetpack Compose 클라이언트입니다.

요구 사항#

  • minSdk 24(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 프로젝트에서는 기본으로 포함됩니다), 좌표로 의존성을 추가하세요.

settings.gradle.ktskotlin
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
    }
}
app/build.gradle.ktskotlin
dependencies {
    implementation("ai.respondo:respondo-sdk:0.1.0")
}

초기화#

Respondo.init을 한 번 호출하고, Compose 트리에 RespondoChatHost()를 한 번 마운트한 뒤, 여러분의 버튼에서 채팅을 여세요.

MainActivity.ktkotlin
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진수로 인코딩합니다. 이 시크릿은 신원이 진짜임을 증명하므로 오직 여러분의 백엔드에만 있어야 하고 앱에 절대 포함되어서는 안 됩니다. 전체 공식과 서버 측 예제는 신원 확인 페이지를 참고하세요.

Kotlinkotlin
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를 통해 명령형으로 읽으세요(앱 아이콘 배지에 적합).

Kotlinkotlin
// 반응형: 읽지 않은 개수를 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을 전달하면 지워지며, 변경될 때마다 새 화면에 대해 능동적 티저가 다시 평가됩니다.

Kotlinkotlin
Respondo.setCurrentScreen("pricing")

다음 단계#

오프라인 상담원 답장을 위한 푸시 알림과 로그인한 사용자를 위한 신원 확인을 설정하세요. 전체 API 표면, XML 호스트용 Fragment 래퍼, 문제 해결은 Android SDK 시작 가이드에서 다룹니다. SDK 소스는 GitHub에 공개되어 있습니다.