快速整合
本頁從零開始接入:初始化、登入、發第一條訊息、顯示會話和訊息列表、退出。開始之前:
- 按概述與安裝引入
im模組; - 在租戶控制檯建立應用,確認執行策略;
- 讓業務服務端在使用者登入你的系統後簽發 IM 登入憑證。App 只拿憑證,不要在 App 中放 Client Secret 或 App Token。
初始化與登入
使用者同意隱私政策後,在主程序初始化一個客戶端。以下程式碼位於業務協程中,context 為 Android Context,ticket 為業務服務端剛簽發的憑證:
kotlin
import com.deeprespond.im.*
val im = DRClient.initialize(context, DRClientOptions(
appKey = "org#app",
apiUrl = "https://api.example.com",
))
im.auth.awaitRestored()
if (im.auth.currentUser == null) {
im.auth.loginWithTicket(ticket)
}
im.connection.waitUntilReady()initialize 立即返回,本地儲存的登入狀態在後臺恢復,所以先 awaitRestored(),再判斷是否需要登入:之前登入過的使用者直接恢復連線,不用再登入。憑證失效時要從業務服務端取新憑證,可以交給 ticketProvider 自動處理。
發訊息
接收者必須是應用記憶體在的 IM 使用者,並滿足應用的好友、禁言和群組策略:
kotlin
val message = im.messages.send(
SendTarget.User("bob"),
OutgoingContent.Text("你好"),
SendOptions(waitUntilSent = true),
)
println(message.messageId)send 預設在訊息寫入傳送佇列後就返回本地訊息,之後由 SDK 發出;這個例子用 waitUntilSent = true 等到服務端確認。全部訊息型別和失敗處理見訊息。
會話和訊息介面
kotlin
val conversation = im.conversations.openSingle("bob")
val list = im.messages.open(conversation.conversationKey)
try {
list.snapshot.collect { snapshot ->
println(snapshot.items.size) // 在 UI 中展示快照。
}
} finally {
list.close()
}這段程式碼在頁面的協程中執行:頁面銷燬、協程取消時,finally 關閉列表。不要在按鈕點選裡啟動一個永遠不結束的收集;介面中的訂閱怎樣跟隨生命週期,見介面與生命週期。發檔案、群聊和推送分別見檔案、群組、離線推送。
退出賬號
kotlin
im.auth.logout(clearLocalData = true)logout 退出賬號。destroy 只在切換 AppKey 或徹底關閉客戶端時使用,不要在每次離開頁面時呼叫。詳見客戶端生命週期。
執行示例與接入檢查
原始碼中的 sdk/android/example 有一個 Kotlin 聊天頁和一個用 Java 介面寫的頁面。準備好構建環境後執行 ./gradlew :example:installDebug,填入你的 AppKey、服務地址和登入憑證。
接入時檢查:
- 普通聊天只需要網路許可權;通知、錄音、攝像頭許可權按用到的功能申請。
- 在本機用 HTTP 聯調時,給 App 配置除錯用的網路安全規則;正式環境使用 HTTPS。
- 能不能加好友、發訊息、建群,由執行策略決定。
- 訊息狀態為
queued(等待傳送)不代表已經傳送成功:觀察訊息的狀態,或用waitUntilSent。 - 目前 SDK 從本地 Maven 倉庫安裝,還沒有釋出到公共 Maven 倉庫。
接入獨立頻道
登入之後,可以按頻道接入加入業務服務端建立的頻道。前提是應用已開通頻道,並且業務服務端已允許這個使用者加入;加入時預設不開啟攝像頭和麥克風。
