เอกสารประกอบ

Android SDK

thin client แบบ Kotlin และ Jetpack Compose ที่เปิดแชทซัพพอร์ต Respondo เป็น bottom sheet ทับบนแอปของคุณ

ข้อกำหนด#

  • minSdk 24 (Android 7.0), compileSdk 35
  • Kotlin 2.x และ Jetpack Compose (SDK มาพร้อม Compose UI)
  • JVM target 17

SDK ดึง dependency ทางอ้อมของตนเอง (Coroutines, kotlinx.serialization, OkHttp, Coil, Compose) และประกาศสิทธิ์ INTERNET ไว้ใน manifest ของตนเอง — ไม่ต้องเพิ่มด้วยมือ

การติดตั้ง#

ไลบรารีเผยแพร่ไปที่ Maven Central ในชื่อ ai.respondo:respondo-sdk. ตรวจสอบให้แน่ใจว่ามี mavenCentral()อยู่ใน repository ของคุณ (โดยค่าเริ่มต้นจะมีอยู่แล้วในโปรเจกต์ Android ใหม่) จากนั้นเพิ่ม dependency ตาม coordinate

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

เริ่มต้นใช้งาน#

เรียก Respondo.init หนึ่งครั้ง, mount RespondoChatHost() หนึ่งครั้งใน Compose tree ของคุณ แล้วเปิดแชทจากปุ่มของคุณเอง

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() // SDK แสดง sheet เมื่อสถานะแชทเป็น OPEN
                }
            }
        }
    }
}

การเรียกทั้งหมดผ่าน singleton Respondo ซึ่งเป็น idempotent, ปลอดภัยจากทุก thread และการเรียกก่อนที่ init จะเสร็จจะถูกบัฟเฟอร์ไว้และเล่นซ้ำ

การระบุตัวตนผู้ใช้#

โดยค่าเริ่มต้นผู้เข้าชมทุกคนเป็นนิรนาม เมื่อเปิดครั้งแรก SDK จะสร้าง visitor_id ที่เสถียรและเก็บไว้ในที่จัดเก็บภายในเครื่อง ดังนั้นผู้ใช้ที่กลับมาจะพบบทสนทนาของตนอีกครั้ง ไม่มี API key ให้ฝัง — แต่ละบทสนทนาถูกปกป้องด้วย session token ต่อบทสนทนา ที่ backend สร้างขึ้นและเลื่อนไปข้างหน้าในทุกข้อความ ดังนั้นผู้เข้าชมนิรนามไม่ต้องยืนยันตัวตนใหม่

เรียก identify เมื่อผู้ใช้ของคุณล็อกอินแล้ว การกระทำนี้จะแนบตัวตนจริงของพวกเขา เพื่อให้ประวัติติดตามไปกับ พวกเขาข้ามอุปกรณ์และการติดตั้งใหม่ และชื่อกับอีเมลของพวกเขาจะปรากฏถัดจากบทสนทนาในกล่องข้อความ ของคุณแทนที่จะเป็นผู้เข้าชมนิรนาม

userHash คือลายเซ็นที่ backend ของคุณ คำนวณจาก identity_secret ของเอเจนต์ — HMAC-SHA256(secret, userId) (หรืออีเมลเมื่อไม่มี userId) เข้ารหัสเป็น hex ตัวพิมพ์เล็ก secret เป็นเครื่องพิสูจน์ว่าตัวตนนั้นเป็นของจริง จึงต้องอยู่บน backend ของคุณเท่านั้น และต้องไม่ถูกส่งไปในแอปเด็ดขาด ดูหน้า การยืนยันตัวตนสำหรับสูตรเต็มและตัวอย่างฝั่งเซิร์ฟเวอร์

Kotlinkotlin
import ai.respondo.sdk.RespondoIdentity

// userHash มาจาก backend ของคุณ (HMAC-SHA256 บน userId) —
// อย่าคำนวณมันในแอป
Respondo.identify(
    RespondoIdentity(
        userId = session.userId,
        email = session.email,
        name = session.fullName,
        userHash = session.respondoUserHash,
    ),
)

// เมื่อออกจากระบบ: ทิ้ง push token, เพิกถอน session, เริ่มผู้เข้าชมนิรนามใหม่
Respondo.clearPushToken()
Respondo.reset()

หากไม่มี hash หรือ hash ผิด จะไม่มีการโยน exception ใด ๆ: backend จะเก็บผู้เข้าชมให้เป็นนิรนามอย่างเงียบ ๆ แชทยังทำงานต่อไป และคุณเพียงเสียลิงก์ข้ามอุปกรณ์ จนกว่าจะมีการส่ง hash ที่ถูกต้องมา การยืนยันจะทำงานก็ต่อเมื่อเอเจนต์มี identity_secret ตั้งไว้ — ปล่อยว่างไว้ระหว่างการพัฒนา แล้ว userId / อีเมล จะถูกยอมรับตามที่เป็น

Observable และ callback#

อ่านสถานะแบบ reactive ในรูป StateFlow (เหมาะกับ Compose) หรือแบบ imperative ผ่าน RespondoListener (เหมาะกับ badge บนไอคอนแอป)

Kotlinkotlin
// Reactive: จำนวนที่ยังไม่อ่านเป็น StateFlow
val unread by Respondo.unreadCount.collectAsState()

// Imperative: listener สำหรับ badge และ analytics
Respondo.setListener(object : RespondoListener {
    override fun onUnreadChanged(count: Int) { updateAppIconBadge(count) }
    override fun onUrlRequested(url: String): Boolean = tryOpenInternally(url)
})

การติดตามหน้าจอ#

รายงานหน้าจอปัจจุบันในทุกการนำทาง เพื่อให้ teaser เชิงรุกและการกำหนดเป้าหมายระดับหน้าจับคู่กับมันได้ ส่ง null เพื่อล้างค่า; ในแต่ละการเปลี่ยนแปลง teaser เชิงรุกจะถูกประเมินใหม่สำหรับหน้าจอใหม่

Kotlinkotlin
Respondo.setCurrentScreen("pricing")

ขั้นตอนถัดไป#

ตั้งค่า พุชการแจ้งเตือนสำหรับคำตอบของเจ้าหน้าที่ขณะออฟไลน์ และ การยืนยันตัวตนสำหรับผู้ใช้ที่ล็อกอินแล้ว ผิวสัมผัส API เต็มรูปแบบ, Fragment wrapper สำหรับ host แบบ XML และการแก้ปัญหา ครอบคลุมอยู่ในคู่มือเริ่มต้นใช้งาน Android SDK; ซอร์สของ SDK เปิดเป็นสาธารณะบน GitHub