Android SDK
Isang manipis na kliyente sa Kotlin at Jetpack Compose na nagbubukas ng chat ng suporta ng Respondo bilang bottom sheet sa ibabaw ng app ninyo.
Mga kinakailangan#
minSdk24 (Android 7.0), compileSdk 35.- Kotlin 2.x at Jetpack Compose (kasama na sa SDK ang Compose UI).
- JVM target 17.
Kusang dinadala ng SDK ang sarili nitong transitive dependencies (Coroutines, kotlinx.serialization, OkHttp, Coil, Compose) at idinedeklara ang permission na INTERNET sa manifest nito — wala kayong kailangang idagdag nang manu-mano.
Pag-install#
Nakapublish ang library sa Maven Central bilang ai.respondo:respondo-sdk. Siguraduhing nasa mga repository ninyo ang mavenCentral() (nandoon na ito bilang default sa bagong proyektong Android), pagkatapos ay idagdag ang dependency ayon sa coordinate.
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
}dependencies {
implementation("ai.respondo:respondo-sdk:0.1.0")
}Pag-initialize#
Tawagin ang Respondo.init nang isang beses, i-mount ang RespondoChatHost() nang isang beses sa Compose tree ninyo, at buksan ang chat mula sa sarili ninyong button.
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>", // mula sa dashboard
channelId = "<channel-uuid>", // opsyonal
// walang baseUrl -> https://api.respondo.ai
),
)
setContent {
MaterialTheme {
Box(modifier = Modifier.fillMaxSize()) {
Button(onClick = { Respondo.open() }) { Text("Support") }
RespondoChatHost() // ipinapakita ng SDK ang sheet kapag OPEN ang estado ng chat
}
}
}
}
}Dumadaan sa singleton na Respondo ang lahat ng tawag. Idempotent ang mga ito, ligtas mula sa kahit anong thread, at ang mga tawag na ginawa bago matapos ang init ay ini-buffer at inuulit.
Pagkilala sa mga user#
Bilang default, anonymous ang bawat bisita. Sa unang paglulunsad, bumubuo ang SDK ng matatag na visitor_id at itinatago ito sa lokal na storage, kaya nahahanap muli ng bumabalik na user ang usapan niya. Walang API key na kailangang i-embed — pinoprotektahan ang bawat usapan ng session token na kada-usapan, na ini-issue ng backend at isinusulong sa bawat mensahe, kaya hindi na kailangang mag-authenticate muli ng anonymous na bisita.
Tawagin ang identify sa sandaling naka-log in na ang user ninyo. Ikinakabit nito ang tunay niyang pagkakakilanlan, kaya sumusunod sa kanya ang kasaysayan niya sa iba't ibang device at sa muling pag-install, at lumalabas ang pangalan at email niya sa tabi ng usapan sa inbox ninyo sa halip na anonymous na bisita.
Ang userHash ay lagdang kinakalkula ng backend ninyo mula sa identity_secret ng ahente — HMAC-SHA256(secret, userId) (o ang email kapag walang userId), naka-encode bilang lowercase hex. Pinatutunayan ng secret na tunay ang pagkakakilanlan, kaya dapat itong manatili lamang sa backend ninyo at hindi kailanman ipinapadala kasama ng app. Tingnan ang pahinang Pagpapatunay ng identity para sa buong pormula at mga halimbawa sa panig ng server.
import ai.respondo.sdk.RespondoIdentity
// Galing sa backend ninyo ang userHash (HMAC-SHA256 sa userId) —
// huwag itong kalkulahin sa loob ng app.
Respondo.identify(
RespondoIdentity(
userId = session.userId,
email = session.email,
name = session.fullName,
userHash = session.respondoUserHash,
),
)
// Sa pag-log out: alisin ang push token, bawiin ang session, magsimula ng bagong anonymous na bisita.
Respondo.clearPushToken()
Respondo.reset()Kung nawawala o mali ang hash, walang bumabagsak: tahimik na pinapanatiling anonymous ng backend ang bisita, patuloy na gumagana ang chat, at nawawala lamang ang ugnayan sa iba't ibang device hanggang may maibigay na wastong hash. Tumatakbo lang ang pagpapatunay kapag may nakatakdang identity_secret ang ahente — iwanan itong walang laman habang nasa development at tatanggapin ang userId / email nang ganoon na lang.
Observables at callback#
Basahin ang estado nang reaktibo bilang StateFlow (mainam para sa Compose) o nang imperatibo sa pamamagitan ng RespondoListener (mainam para sa badge sa icon ng app).
// Reaktibo: bilang ng hindi pa nababasa bilang StateFlow.
val unread by Respondo.unreadCount.collectAsState()
// Imperatibo: listener para sa mga badge at analytics.
Respondo.setListener(object : RespondoListener {
override fun onUnreadChanged(count: Int) { updateAppIconBadge(count) }
override fun onUrlRequested(url: String): Boolean = tryOpenInternally(url)
})Pagsubaybay sa screen#
Iulat ang kasalukuyang screen sa bawat navigation para makatugma rito ang mga proactive na teaser at ang page-level na targeting. Magpasa ng null para burahin ito; sa bawat pagbabago, muling sinusuri ang proactive na teaser para sa bagong screen.
Respondo.setCurrentScreen("pricing")Mga susunod na hakbang#
I-set up ang Mga push notification para sa mga sagot ng tagasuporta habang offline at ang Pagpapatunay ng identity para sa mga naka-log in na user. Ang buong API surface, ang Fragment wrapper para sa mga XML host, at ang paglutas ng problema ay tinatalakay sa gabay sa pagsisimula ng Android SDK; bukas sa publiko ang mga source ng SDK sa GitHub.