# React Native IM 接入 基于 `@xuqm/rn-im` 模块实现即时通讯功能,使用 WatermelonDB 进行本地消息存储。 --- ## 初始化与登录 ### 初始化 ```ts import { XuqmSDK } from '@xuqm/rn-common' await XuqmSDK.initialize({ appKey: 'your_app_key', logLevel: __DEV__ ? 'debug' : 'warn', }) ``` ### 登录 ```ts import { XuqmSDK } from '@xuqm/rn-common' await XuqmSDK.login({ userId: 'user_001', userSig: 'your_user_sig_jwt', }) ``` > 如果集成了 `rn-im`,`XuqmSDK.login` 会自动触发 `ImSDK` 连接 WebSocket,业务侧无需单独调用 `ImSDK.login`。 --- ## 消息收发 ### 监听实时消息 ```ts import { ImSDK } from '@xuqm/rn-im' ImSDK.addEventListener('message', (msg) => { console.log('收到消息:', msg.msgType, msg.content) }) ImSDK.addEventListener('read', (msg) => { console.log('已读回执:', msg.id) }) ImSDK.addEventListener('revoke', (data) => { console.log('消息被撤回:', data.msgId) }) ``` ### 发送文本消息 ```ts const msg = await ImSDK.sendMessage( 'user_002', // toId 'SINGLE', // chatType: 'SINGLE' | 'GROUP' 'TEXT', // msgType 'Hello!' // content ) ``` ### 发送图片 ```ts const msg = await ImSDK.sendImageMessage( 'user_002', 'SINGLE', '/path/to/image.jpg', // 本地 URI 800, // 宽 600 // 高 ) ``` ### 获取历史消息 ```ts // 单聊历史 const history = await ImSDK.fetchHistory('user_002', page, size) // 群历史 const groupHistory = await ImSDK.fetchGroupHistory('group_xxx', page, size) ``` --- ## WatermelonDB 本地存储 `rn-im` 使用 WatermelonDB(SQLite)存储本地消息,按 `appKey + userId` 自动隔离。 ```ts import { ImDatabase } from '@xuqm/rn-im' // 消息搜索(本地) const params: MessageSearchParams = { keyword: '会议', toId: 'user_002', chatType: 'SINGLE', msgTypes: ['TEXT'], limit: 20, } const results = await ImSDK.searchMessages(params) ``` --- ## 群聊 ```ts // 创建群 const group = await ImSDK.createGroup('项目讨论', ['user_002', 'user_003']) // 群列表 const groups = await ImSDK.listGroups() // 添加成员 await ImSDK.addGroupMember('group_xxx', 'user_004') // 移除成员 await ImSDK.removeGroupMember('group_xxx', 'user_004') // 退出群聊 await ImSDK.leaveGroup('group_xxx') ``` 详见 [RN 群聊文档 →](./group) --- ## 会话列表 ```ts // 订阅会话变化 const unsub = ImSDK.subscribeConversations((conversations) => { console.log(conversations) }) // 置顶 await ImSDK.setConversationPinned('user_002', 'SINGLE', true) // 免打扰 await ImSDK.setConversationMuted('group_xxx', 'GROUP', true) // 标记已读 await ImSDK.markRead('user_002') ``` --- ## 离线消息同步 ```ts // 查询离线消息数量(示例) const count = await ImSDK.offlineMessageCount() // 同步离线消息(示例) const messages = await ImSDK.syncOfflineMessages() ``` --- ## 断开连接 ```ts ImSDK.disconnect() ``` --- ## 类型参考 ```ts interface ImMessage { id: string fromId: string toId: string chatType: 'SINGLE' | 'GROUP' msgType: 'TEXT' | 'IMAGE' | 'AUDIO' | 'VIDEO' | 'FILE' | 'LOCATION' | 'NOTIFY' | 'CUSTOM' | 'RICH_TEXT' | 'CALL_AUDIO' | 'CALL_VIDEO' | 'FORWARD' | 'REVOKED' content: string status: 'SENDING' | 'SENT' | 'DELIVERED' | 'READ' | 'FAILED' | 'REVOKED' createdAt: number } interface ConversationData { targetId: string chatType: 'SINGLE' | 'GROUP' lastMsgContent: string lastMsgType: string lastMsgTime: number unreadCount: number isMuted: boolean isPinned: boolean } ``` [→ 完整 API Reference](./api)