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 を一度呼び出し、 RespondoChatHost() を Compose ツリーに一度マウントし、自分のボタンからチャットを開きます。
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 シングルトンを経由します。冪等で、どのスレッドからでも安全に呼び出せ、初期化完了前に行われた呼び出しはバッファリングされて再生されます。
ユーザーの識別#
デフォルトではすべての訪問者は匿名です。初回起動時に SDK は安定した visitor_id を生成してローカルストレージに保持するため、再訪したユーザーは自分の会話を再び見つけられます。埋め込む API キーはありません——各会話は、バックエンドが発行しメッセージごとに前へスライドさせる会話ごとのセッショントークンで保護されるため、匿名の訪問者が再認証する必要は決してありません。
ユーザーがサインインしたら identify を一度呼び出します。これにより実際の身元が紐づけられ、履歴が複数デバイスや再インストールをまたいで追随し、受信トレイでは匿名の訪問者ではなく名前とメールアドレスが会話の横に表示されます。
userHash はあなたのバックエンドがエージェントの identity_secret から計算する署名です—— HMAC-SHA256(secret, userId) (userId がない場合はメールアドレス)を小文字の hex でエンコードします。シークレットは身元が本物であることを証明するため、あなたのバックエンドにのみ置き、アプリに同梱してはいけません。完全な数式とサーバー側の例については本人確認のページを参照してください。
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")