XuqmGroup-RNSDK/packages/im/README.md
XuqmGroup 4c3019edab docs: 添加 CLAUDE.md + 各 package README + 架构总览 + 模块待开发说明
Agent 8 文档生成:
- CLAUDE.md 项目上下文
- 各 package README (common/update/push/im/xwebview/license/log)
- docs/架构总览.md
- docs/模块待开发说明.md
2026-06-16 12:14:52 +08:00

128 行
4.3 KiB
Markdown

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# @xuqm/rn-im
XuqmGroup RN SDK IM 模块。提供 WebSocket 实时通信、会话管理、消息收发、群组管理、关系链管理。
## 安装
```bash
yarn add @xuqm/rn-im @nozbe/watermelondb
```
Peer dependencies`@nozbe/watermelondb >= 0.27.0`,`react-native >= 0.76`
## 使用
**无需手动初始化。** `XuqmSDK.setUserInfo({ userId, userSig })` 被调用时,SDK 自动完成 IM 登录。
```ts
import { ImSDK } from '@xuqm/rn-im'
// 发送消息
await ImSDK.sendTextMessage('user_002', 'SINGLE', 'Hello!')
// 获取会话列表
const conversations = await ImSDK.listConversations()
// 监听新消息
ImSDK.addListener({
onMessage: (msg) => console.log('新消息:', msg),
onConnected: () => console.log('IM 已连接'),
})
```
## API
### 连接管理
| API | 说明 |
|-----|------|
| `ImSDK.login(userId, userSig)` | 手动登录(通常不需要直接调用) |
| `ImSDK.refreshToken(userSig)` | 刷新 userSig过期时调用 |
| `ImSDK.disconnect()` | 断开连接 |
| `ImSDK.reconnect()` | 重新连接 |
| `ImSDK.isConnected()` | 检查连接状态 |
### 消息 API
| API | 说明 |
|-----|------|
| `ImSDK.sendMessage(toId, chatType, msgType, content, mentionedUserIds?)` | 发送消息 |
| `ImSDK.sendTextMessage(toId, chatType, content, mentionedUserIds?)` | 发送文本 |
| `ImSDK.sendImageMessage(toId, chatType, localUri, width?, height?)` | 发送图片 |
| `ImSDK.sendVideoMessage(toId, chatType, localUri, thumbnailUri?, duration?)` | 发送视频 |
| `ImSDK.sendAudioMessage(toId, chatType, localUri, duration)` | 发送语音 |
| `ImSDK.sendFileMessage(toId, chatType, localUri, filename, size)` | 发送文件 |
| `ImSDK.sendQuoteMessage(toId, chatType, quotedMsgId, quotedContent, text)` | 引用回复 |
| `ImSDK.sendLocationMessage(toId, chatType, latitude, longitude, title?, address?)` | 发送位置 |
| `ImSDK.revokeMessage(messageId)` | 撤回消息 |
| `ImSDK.editMessage(messageId, content)` | 编辑消息 |
### 会话 API
| API | 说明 |
|-----|------|
| `ImSDK.listConversations()` | 获取会话列表 |
| `ImSDK.subscribeConversations(callback)` | 订阅会话变更(返回 unsubscribe |
| `ImSDK.markRead(targetId, chatType?)` | 标记已读 |
| `ImSDK.deleteConversation(targetId, chatType)` | 删除会话 |
| `ImSDK.getTotalUnreadCount()` | 获取总未读数 |
### 历史消息
| API | 说明 |
|-----|------|
| `ImSDK.fetchHistory(toId, page?, size?)` | 获取单聊历史(优先本地缓存) |
| `ImSDK.fetchGroupHistory(groupId, page?, size?)` | 获取群聊历史 |
| `ImSDK.fetchHistoryWithFilters(toId, params)` | 按条件查询历史 |
| `ImSDK.searchMessages(params)` | 搜索消息(本地 WatermelonDB |
| `ImSDK.locateHistoryPage(toId, messageId)` | 定位消息所在页 |
### 群组 API
| API | 说明 |
|-----|------|
| `ImSDK.createGroup(name, memberIds, groupType?)` | 创建群组 |
| `ImSDK.listGroups()` | 获取群组列表 |
| `ImSDK.getGroupInfo(groupId)` | 获取群组信息 |
| `ImSDK.listGroupMembers(groupId)` | 获取群成员 |
| `ImSDK.addGroupMember(groupId, userId)` | 添加成员 |
| `ImSDK.removeGroupMember(groupId, userId)` | 移除成员 |
| `ImSDK.setGroupRole(groupId, userId, role)` | 设置管理员 |
| `ImSDK.muteGroupMember(groupId, userId, minutes)` | 禁言 |
| `ImSDK.dismissGroup(groupId)` | 解散群组 |
### 关系链 API
| API | 说明 |
|-----|------|
| `ImSDK.listFriends()` | 好友列表 |
| `ImSDK.addFriend(friendId)` | 添加好友 |
| `ImSDK.removeFriend(friendId)` | 删除好友 |
| `ImSDK.sendFriendRequest(toUserId, remark?)` | 发送好友申请 |
| `ImSDK.acceptFriendRequest(requestId)` | 接受好友申请 |
| `ImSDK.addToBlacklist(blockedUserId)` | 加入黑名单 |
| `ImSDK.checkBlacklist(targetUserId)` | 检查黑名单 |
### 事件监听
```ts
ImSDK.addListener({
onConnected: () => {},
onDisconnected: (code, reason) => {},
onMessage: (msg) => {},
onGroupMessage: (msg) => {},
onSystemMessage: (msg) => {},
onRead: (msg) => {},
onRevoke: (data) => {},
})
ImSDK.removeListener(listener)
```
## 消息类型
`TEXT` / `IMAGE` / `VIDEO` / `AUDIO` / `FILE` / `CUSTOM` / `LOCATION` / `NOTIFY` / `RICH_TEXT` / `CALL_AUDIO` / `CALL_VIDEO` / `QUOTE` / `MERGE` / `REVOKED` / `FORWARD`
## 本地存储
使用 WatermelonDB 进行本地消息缓存,支持离线消息同步和本地搜索。DB 名称由 `appKey + userId` 派生。