XuqmGroup-Web/docs-site/docs/ios/im.md
XuqmGroup 6cd938cfbc feat(android-sdk): 添加完整的IM客户端SDK实现
- 实现了Android SDK的完整IM功能接口,包括消息、群组、好友、会话等核心功能
- 添加了消息收发、历史记录、撤回编辑等完整的消息操作能力
- 实现了群组管理功能,包括创建、成员管理、权限设置等操作
- 添加了好友关系链管理,支持添加、删除、分组等操作
- 实现了会话管理功能,包括置顶、免打扰、已读状态等
- 添加了黑名单、资料管理、搜索等辅助功能
- 补齐了批量操作接口,提升客户端操作效率
- 实现了WebSocket连接管理和事件监听机制
- 添加了离线消息同步和状态管理功能
2026-05-02 22:57:55 +08:00

255 行
6.2 KiB
Markdown

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

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

# iOS IM 接入
基于 `XuqmSDK` 中的 IM 子模块实现即时通讯功能。
---
## 初始化与登录
### 初始化
```swift
import XuqmSDK
let config = SDKConfig(appKey: "your_app_key", appSecret: "your_app_secret")
XuqmSDK.shared.initialize(config: config)
```
### 登录UserSig 模式)
```swift
import XuqmSDK
try await XuqmSDK.shared.login(userId: "user_001", userSig: "your_user_sig_jwt")
```
> `userSig` 由业务服务端用 `appSecret` 签发。若需更新登录态,直接重新登录即可。
---
## 消息收发
### 设置事件代理
```swift
import XuqmSDK
ImSDK.shared.setDelegate(self)
extension ViewController: ImEventDelegate {
func imClientDidConnect() { print("WS connected") }
func imClientDidReceiveMessage(_ msg: ImMessage) { /* 处理单聊消息 */ }
func imClientDidReceiveGroupMessage(_ msg: ImMessage) { /* 处理群消息 */ }
func imClientDidReadMessage(_ msg: ImMessage) { /* 对方已读回执 */ }
func imClientDidReceiveRevokedMessage(_ msg: ImMessage) { /* 消息被撤回 */ }
func imClientDidDisconnect(reason: String?) { /* 断线 */ }
func imClientDidError(_ error: String) { /* 错误 */ }
}
```
### 发送文本消息
```swift
let msg = ImSDK.shared.sendTextMessage(
toId: "user_002",
chatType: .single,
content: "Hello!"
)
```
### 发送多媒体消息
```swift
// 图片
let msg = ImSDK.shared.sendImageMessage(
toId: "user_002",
chatType: .single,
url: "https://cdn.example.com/img.jpg",
width: 800,
height: 600
)
// 视频
let msg = ImSDK.shared.sendVideoMessage(
toId: "user_002",
chatType: .single,
url: "https://cdn.example.com/video.mp4",
duration: 15,
size: 5_000_000
)
// 语音
let msg = ImSDK.shared.sendAudioMessage(
toId: "user_002",
chatType: .single,
url: "https://cdn.example.com/audio.mp3",
duration: 5,
size: 100_000
)
// 文件
let msg = ImSDK.shared.sendFileMessage(
toId: "user_002",
chatType: .single,
url: "https://cdn.example.com/file.pdf",
name: "document.pdf",
size: 2_000_000
)
// 位置
let msg = ImSDK.shared.sendLocationMessage(
toId: "user_002",
chatType: .single,
lat: 31.2304,
lng: 121.4737,
title: "上海",
address: "上海市黄浦区"
)
```
### 撤回与编辑
```swift
try await ImSDK.shared.revokeMessage(messageId: msg.id)
try await ImSDK.shared.editMessage(messageId: msg.id, content: "新内容")
```
### 获取历史消息
```swift
let history = try await ImSDK.shared.fetchHistory(toId: "user_002", page: 0, size: 20)
let groupHistory = try await ImSDK.shared.fetchGroupHistory(groupId: "group_xxx", page: 0, size: 20)
```
---
## 群聊
### 创建群组
```swift
let group = try await ImSDK.shared.createGroup(
name: "项目讨论",
memberIds: ["user_001", "user_002"],
groupType: "WORK"
)
```
### 订阅群消息
```swift
ImSDK.shared.subscribeGroup(group.id)
```
### 发送群消息
```swift
ImSDK.shared.sendTextMessage(toId: group.id, chatType: .group, content: "大家好")
```
### 群管理
```swift
// 添加/移除成员
try await ImSDK.shared.addGroupMember(groupId: group.id, userId: "user_003")
try await ImSDK.shared.removeGroupMember(groupId: group.id, targetUserId: "user_003")
// 设置角色
try await ImSDK.shared.setGroupRole(groupId: group.id, userId: "user_003", role: "ADMIN")
// 禁言
try await ImSDK.shared.muteGroupMember(groupId: group.id, userId: "user_003", minutes: 60)
// 转让群主
try await ImSDK.shared.transferGroupOwner(groupId: group.id, newOwnerId: "user_002")
// 退出/解散
try await ImSDK.shared.leaveGroup(groupId: group.id)
try await ImSDK.shared.dismissGroup(groupId: group.id)
```
---
## 好友管理
```swift
let friends = try await ImSDK.shared.listFriends()
try await ImSDK.shared.addFriend(friendId: "user_002")
try await ImSDK.shared.removeFriend(friendId: "user_002")
// 好友请求
try await ImSDK.shared.sendFriendRequest(toUserId: "user_002", remark: "你好")
let requests = try await ImSDK.shared.listFriendRequests(direction: "incoming")
try await ImSDK.shared.acceptFriendRequest(requestId: "request_id")
try await ImSDK.shared.rejectFriendRequest(requestId: "request_id")
// 黑名单
let blacklist = try await ImSDK.shared.listBlacklist()
try await ImSDK.shared.addToBlacklist(blockedUserId: "user_002")
try await ImSDK.shared.removeFromBlacklist(blockedUserId: "user_002")
```
---
## 会话列表
```swift
let conversations = try await ImSDK.shared.listConversations()
try await ImSDK.shared.setConversationPinned(targetId: "user_002", chatType: .single, pinned: true)
try await ImSDK.shared.setConversationMuted(targetId: "user_002", chatType: .single, muted: true)
try await ImSDK.shared.markRead(targetId: "user_002", chatType: .single)
try await ImSDK.shared.setDraft(targetId: "user_002", chatType: .single, draft: "未完成")
try await ImSDK.shared.deleteConversation(targetId: "user_002", chatType: .single)
```
---
## 离线消息同步
```swift
let count = try await ImSDK.shared.offlineMessageCount()
let offlineMessages = try await ImSDK.shared.syncOfflineMessages()
```
---
## 连接状态监听
```swift
let state = ImSDK.shared.connectionState
// .disconnected / .connecting / .connected
ImSDK.shared.addConnectionStateListener { state in
switch state {
case .connected: print("IM 已连接")
case .connecting: print("IM 连接中...")
case .disconnected: print("IM 已断开")
}
}
```
---
## 消息类型
| MsgType | 说明 | content 结构 |
|---------|------|-------------|
| `.text` | 纯文本 | `String` |
| `.image` | 图片 | `{url, width, height, thumbnailUrl?}` |
| `.video` | 视频 | `{url, duration, thumbnailUrl, size}` |
| `.audio` | 语音 | `{url, duration, size}` |
| `.file` | 文件 | `{url, name, size, mimeType}` |
| `.location` | 位置 | `{lat, lng, address, title}` |
| `.custom` | 自定义 | 任意 JSON |
| `.notify` | 系统通知 | `{title, content}` |
| `.richText` | 富文本 | `{html}` |
| `.callAudio` | 语音通话信令 | `{action}` |
| `.callVideo` | 视频通话信令 | `{action}` |
| `.forward` | 转发 | `{originalSender, originalContent}` |
| `.quote` | 引用 | `{quotedMsgId, quotedContent, text}` |
| `.merge` | 合并转发 | `{title, msgList}` |
| `.revoked` | 撤回 | 系统内部填充 |
[→ 完整 API Reference](./api)