用户端要怎么接 morsaim-im

这份文档给接入方看:你的业务后端 + 你的 App。IM 是独立服务,多个 App 共用,数据按 app_id 隔离。

当前服务地址:

从这里开始

  1. 在控制台用引导密钥建一个 App,抄走 app_secret(只亮一次)。
  2. 业务后端用 AppSecret 导入用户、签发 User Token。AppSecret 不要进客户端。
  3. 客户端下载对应 SDK,用 Token 连 WebSocket,收发消息。

三把钥匙

钥匙谁拿干什么
Bootstrap Secret平台运维进控制台、建/停 App。不要给接入方用户端。
AppSecret你的业务后端调 REST:导入用户、发 Token、代发消息、管好友/群。
User Token终端 SDK/v1/ws。默认 90 天。
客户端只允许拿 User Token。AppSecret 泄漏等于别人能以你的 App 发消息、签发任意用户的 Token。

接入步骤

1. 建 App

控制台「应用 → 新建」,或后端:


      

响应里的 app_secret / webhook_secret 只返回这一次,立刻存进你的密钥系统。

2. 导入用户

user_id 由你定义,不能包含英文冒号 :。先导入再连线。



      

3. 签发 User Token


      

token 交给客户端。过期后由你的后端再签一张。

4. 客户端连上

SDK 会把 https 换成 wss,连:


      

连上后 SDK 会自动 list_conv,再按每个会话已见的 max_seq + 1sync。发送必须带 client_msg_id(SDK 会自己生成),以服务端 ack 为准——ack 表示已经落库、有序号,不是“进了队列”。

下载 SDK

下面是当前服务打进镜像的源码包。每个 zip 里都有 Cursor Skill:解压进工程后打开对话,让 AI 读 AGENTS.md.cursor/skills/morsaim-im/SKILL.md,按清单接入。不要用 OpenIM SDK。

Swift / iOS

SPM 包 MorsaimIM · iOS 15+ / macOS 12+
下载 morsaim-im-swift.zip 使用说明

Android / Kotlin

模块 cn.morsaim.im.sdk · OkHttp + 协程
下载 morsaim-im-android.zip 使用说明

Web / TypeScript

包名 morsaim-im · 浏览器 / Node 18+
下载 morsaim-im-web.zip 使用说明

Go

模块 github.com/morsaim-h/morsaim-im/sdk
下载 morsaim-im-go.zip 使用说明

Swift / iOS

安装

  1. 下载并解压 morsaim-im-swift.zip,放到你的工程旁,例如 Vendor/MorsaimIM
  2. Xcode → File → Add Package Dependencies → Add Local → 选这个目录(里面有 Package.swift)。
  3. 把产品 MorsaimIM 加到 App target。

也可用 SPM 路径:

.package(path: "Vendor/MorsaimIM")

使用


      

      

Android / Kotlin

安装

  1. 解压 morsaim-im-android.zip 到例如 sdk/morsaim-im
  2. settings.gradle.ktsinclude(":morsaim-im")project(":morsaim-im").projectDir 指到该目录。
  3. App 模块:implementation(project(":morsaim-im"))
  4. 网络权限:android.permission.INTERNET

依赖已写在包内:OkHttp 4.12、kotlinx-coroutines。Android 工程用 JDK 17+ 即可。

使用


      

connect / send / syncAll 都是 suspend,在 viewModelScopelifecycleScope 里调。回调默认在 WebSocket 线程,更新 UI 请切回主线程。

Web / TypeScript

安装

  1. 解压 morsaim-im-web.zip
  2. 在该目录执行 npm install && npm run build
  3. 业务项目:npm install /绝对路径/morsaim-im-web,或把 src/ 拷进工程直接 import。

使用


      

浏览器用原生 WebSocket。Node 18+ 同样可以。页面关闭前调用 client.close()

Go

模块路径 github.com/morsaim-h/morsaim-im/sdk。也可以下载 zip,把 client.go / types.go / store.go 放进你的 module(不要 import 我们的 internal/)。



      

长连接协议

帧是 JSON 文本,字段是我们的,不是 OpenIM 的。

{
  "id": "r_ab12…",
  "op": "send | ack | push | sync | sync_result | list_conv | list_result | ping | pong | error | kick",
  "payload": {}
}
方向op含义
C→Sping心跳。默认 20s 一次,90s 无 ping 服务端断开。
C→Ssend发消息。payload:client_msg_id, recv_id 或 group_id, type, body
S→Cack已落库。带 server_msg_id, conversation_id, seq
S→Cpush推给在线接收方(发送方自己的 ack 另外走)
C→Slist_conv会话列表
C→Ssync按 conversation_id + start_seq 补拉
S→Ckick被踢下线,SDK 触发 onKick,不要自动重连

会话 ID

幂等

同一 (app_id, sender_id, client_msg_id) 只成一条。重试发送会得到同一条 ack,不会再 push 一遍。

REST 一览(AppSecret)

请求头 Authorization: Bearer {app_secret}。控制台的 Bootstrap 接口另算,客户端不要调。

方法路径用途
PUT/v1/users/{user_id}导入/更新用户
GET/v1/users/{user_id}查用户
POST/v1/auth/user-tokens签发 User Token。body: {"user_id":"..."}
POST/v1/messages后端代发。ack 语义同 WS
GET/v1/users/{id}/conversations会话列表
GET/v1/conversations/{id}/messages补拉历史
POST/v1/conversations/{id}/read已读
POST/v1/friends/applications申请好友
POST/v1/groups建群

建 App 时可配 webhook_urlpush_url。Webhook 签名 HMAC-SHA256(timestamp.body)。接收方当时不在线才会 POST push.offline,失败不影响 ack。

注意