177 lines
5.0 KiB
Markdown
177 lines
5.0 KiB
Markdown
|
|
# 腾讯云 IM SDK 到 OpenIM 迁移指南
|
|||
|
|
|
|||
|
|
## 迁移状态
|
|||
|
|
|
|||
|
|
### ✅ 已完成的工作
|
|||
|
|
|
|||
|
|
1. **依赖项迁移**
|
|||
|
|
- 从 `build.gradle.kts` 中移除了腾讯云 IM SDK 依赖 (`libs.imsdk.plus`)
|
|||
|
|
- 从 `gradle/libs.versions.toml` 中移除了相关版本定义
|
|||
|
|
- 保留了 OpenIM SDK 依赖 (`io.openim:android-sdk`, `io.openim:core-sdk`)
|
|||
|
|
|
|||
|
|
2. **核心组件迁移**
|
|||
|
|
- ✅ `TrtcHelper.kt` - 完全迁移到 OpenIM API
|
|||
|
|
- ✅ `Chat.kt` 实体类 - 更新为 OpenIM 消息模型
|
|||
|
|
- ✅ `AgentChatListViewModel.kt` - 部分迁移到 OpenIM API
|
|||
|
|
- ✅ `OpenIMManager.kt` - 完整的 OpenIM 管理器
|
|||
|
|
- ✅ `OpenIMService.kt` - OpenIM 后台服务
|
|||
|
|
- ✅ `AppState.kt` - 已使用 OpenIM 进行初始化和登录
|
|||
|
|
|
|||
|
|
3. **兼容层创建**
|
|||
|
|
- 创建了 `TencentIMCompat.kt` 兼容层,避免编译错误
|
|||
|
|
- 所有使用腾讯云 IM 的文件都已添加兼容层导入
|
|||
|
|
|
|||
|
|
4. **配置清理**
|
|||
|
|
- AndroidManifest.xml 已经是干净的,无需额外清理
|
|||
|
|
|
|||
|
|
### 🔄 需要进一步完成的工作
|
|||
|
|
|
|||
|
|
#### 1. 完整的 ViewModel 迁移
|
|||
|
|
以下文件仍在使用兼容层,需要完全迁移到 OpenIM:
|
|||
|
|
|
|||
|
|
- `ChatViewModel.kt` - 聊天功能核心
|
|||
|
|
- `ChatAiViewModel.kt` - AI 聊天功能
|
|||
|
|
- `GroupChatViewModel.kt` - 群聊功能
|
|||
|
|
- `FriendChatListViewModel.kt` - 好友聊天列表
|
|||
|
|
- `GroupChatListViewModel.kt` - 群聊列表
|
|||
|
|
- `MessageListViewModel.kt` - 消息列表
|
|||
|
|
- `MineAgentViewModel.kt` - 我的智能体
|
|||
|
|
- `CreateGroupChatViewModel.kt` - 创建群聊
|
|||
|
|
|
|||
|
|
#### 2. UI 组件迁移
|
|||
|
|
以下 Screen 文件需要更新以使用新的数据模型:
|
|||
|
|
|
|||
|
|
- `ChatScreen.kt`
|
|||
|
|
- `ChatAiScreen.kt`
|
|||
|
|
- `GroupChatScreen.kt`
|
|||
|
|
|
|||
|
|
#### 3. 消息类型映射
|
|||
|
|
需要完善 OpenIM 消息类型到应用内部类型的映射:
|
|||
|
|
|
|||
|
|
```kotlin
|
|||
|
|
// OpenIM 消息类型
|
|||
|
|
101 -> TEXT
|
|||
|
|
102 -> IMAGE
|
|||
|
|
103 -> AUDIO
|
|||
|
|
104 -> VIDEO
|
|||
|
|
105 -> FILE
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## OpenIM 集成状态
|
|||
|
|
|
|||
|
|
### ✅ 已集成的功能
|
|||
|
|
|
|||
|
|
1. **SDK 初始化** - `OpenIMManager.initSDK()`
|
|||
|
|
2. **用户登录** - `AppState.loginToOpenIM()`
|
|||
|
|
3. **连接监听** - 连接状态、踢下线、token 过期
|
|||
|
|
4. **消息监听** - 新消息、消息撤回、已读回执等
|
|||
|
|
5. **会话管理** - 会话变化、未读数统计
|
|||
|
|
6. **用户信息管理** - 用户资料更新
|
|||
|
|
7. **好友关系管理** - 好友申请、添加、删除等
|
|||
|
|
8. **群组管理** - 群信息变更、成员管理等
|
|||
|
|
|
|||
|
|
### 🔧 需要实现的功能
|
|||
|
|
|
|||
|
|
1. **消息发送**
|
|||
|
|
```kotlin
|
|||
|
|
// 需要实现
|
|||
|
|
OpenIMClient.getInstance().messageManager.sendMessage(...)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **历史消息获取**
|
|||
|
|
```kotlin
|
|||
|
|
// 需要实现
|
|||
|
|
OpenIMClient.getInstance().messageManager.getAdvancedHistoryMessageList(...)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **会话列表获取**
|
|||
|
|
```kotlin
|
|||
|
|
// 已在 AgentChatListViewModel 中部分实现
|
|||
|
|
OpenIMClient.getInstance().conversationManager.getAllConversationList(...)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **图片消息处理**
|
|||
|
|
- 需要适配 OpenIM 的 `PictureElem` 结构
|
|||
|
|
- 更新图片显示逻辑
|
|||
|
|
|
|||
|
|
## 迁移步骤建议
|
|||
|
|
|
|||
|
|
### 第一阶段:核心聊天功能
|
|||
|
|
1. 完成 `ChatViewModel.kt` 的完整迁移
|
|||
|
|
2. 实现消息发送和接收
|
|||
|
|
3. 实现历史消息加载
|
|||
|
|
4. 测试基本聊天功能
|
|||
|
|
|
|||
|
|
### 第二阶段:会话管理
|
|||
|
|
1. 完成各种 ChatListViewModel 的迁移
|
|||
|
|
2. 实现会话列表的正确显示
|
|||
|
|
3. 实现未读消息统计
|
|||
|
|
|
|||
|
|
### 第三阶段:高级功能
|
|||
|
|
1. 群聊功能迁移
|
|||
|
|
2. 文件、图片等多媒体消息
|
|||
|
|
3. 消息状态和已读回执
|
|||
|
|
|
|||
|
|
### 第四阶段:清理和优化
|
|||
|
|
1. 删除兼容层 `TencentIMCompat.kt`
|
|||
|
|
2. 清理所有临时代码
|
|||
|
|
3. 性能优化和测试
|
|||
|
|
|
|||
|
|
## 关键 API 对比
|
|||
|
|
|
|||
|
|
### 消息发送
|
|||
|
|
```kotlin
|
|||
|
|
// 腾讯云 IM
|
|||
|
|
V2TIMManager.getMessageManager().sendMessage(message, receiver, null, ...)
|
|||
|
|
|
|||
|
|
// OpenIM
|
|||
|
|
OpenIMClient.getInstance().messageManager.sendMessage(message, receiver, ...)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 获取会话列表
|
|||
|
|
```kotlin
|
|||
|
|
// 腾讯云 IM
|
|||
|
|
V2TIMManager.getConversationManager().getConversationList(...)
|
|||
|
|
|
|||
|
|
// OpenIM
|
|||
|
|
OpenIMClient.getInstance().conversationManager.getAllConversationList(...)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 消息监听
|
|||
|
|
```kotlin
|
|||
|
|
// 腾讯云 IM
|
|||
|
|
V2TIMManager.getMessageManager().addAdvancedMsgListener(listener)
|
|||
|
|
|
|||
|
|
// OpenIM
|
|||
|
|
OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(listener)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **数据结构差异**:OpenIM 和腾讯云 IM 的数据结构有所不同,需要仔细映射
|
|||
|
|
2. **回调机制**:OpenIM 使用不同的回调接口
|
|||
|
|
3. **消息 ID**:OpenIM 使用 `clientMsgID`,腾讯云使用 `msgID`
|
|||
|
|
4. **时间戳**:注意时间戳的单位和格式差异
|
|||
|
|
5. **用户 ID**:确保用户 ID 在两个系统中的一致性
|
|||
|
|
|
|||
|
|
## 测试建议
|
|||
|
|
|
|||
|
|
1. **单元测试**:为每个迁移的组件编写测试
|
|||
|
|
2. **集成测试**:测试完整的聊天流程
|
|||
|
|
3. **兼容性测试**:确保与现有数据的兼容性
|
|||
|
|
4. **性能测试**:对比迁移前后的性能表现
|
|||
|
|
|
|||
|
|
## 删除兼容层的时机
|
|||
|
|
|
|||
|
|
当以下条件都满足时,可以安全删除 `TencentIMCompat.kt`:
|
|||
|
|
|
|||
|
|
1. 所有 ViewModel 都已完全迁移到 OpenIM
|
|||
|
|
2. 所有功能都已测试通过
|
|||
|
|
3. 没有编译错误
|
|||
|
|
4. 应用运行正常
|
|||
|
|
|
|||
|
|
删除步骤:
|
|||
|
|
1. 删除 `app/src/main/java/com/aiosman/ravenow/compat/TencentIMCompat.kt`
|
|||
|
|
2. 从所有文件中移除 `import com.aiosman.ravenow.compat.*`
|
|||
|
|
3. 清理所有相关的临时注释
|