
本文适用读者:已接入腾讯云即时通信 IM(Tencent Cloud Chat),希望迁移到ZEGO ZIM(ZEGO Instant Messaging)的客户端 / 服务端开发者。本文只做技术迁移路径的梳理,不替代对两家产品的商务评估。功能、计费、合规等维度请结合自身业务另行评估。
下面以 Web / TypeScript 为例展开代码对照,Android、iOS、Flutter、Unity 等平台的概念与流程完全一致,接口名可在官方文档中按平台查取。
1. 迁移前必读
迁移最大的成本不在代码,而在心智模型。腾讯云 IM 与 ZIM 在概念上高度对应,先把概念对齐,代码替换就是机械工作。
| 概念 | 腾讯云 IM (Tencent Cloud Chat) | ZEGO ZIM | 差异要点 |
| 应用标识 | SDKAppID | AppID(AppID + AppSign / ServerSecret) | 都在各自控制台创建项目后获得;ZIM 服务权限需在 ZEGO 控制台自助开通 |
| 登录鉴权 | UserSig(服务端用密钥对 userID 签名) | Token(业务服务端用 ServerSecret 生成)或 AppSign 鉴权 | 鉴权模型一致:密钥留在服务端,客户端只拿票据。ZIM 的 Token 有过期机制,需监听续期 |
| SDK 实例 | TencentCloudChat.create({ SDKAppID }) 返回单例 chat | ZIM.create(config) + ZIM.getInstance() | ZIM 的 create 只在首次调用时创建实例,之后返回 null,需用 getInstance() 取单例 |
| 事件订阅 | chat.on(TencentCloudChat.EVENT.XXX, handler),事件名是常量 | zim.on(‘xxx’, handler),事件名是字符串 | 腾讯在登录前用 on 注册,ZIM 同样要求登录前注册回调 |
| 会话类型 | C2C(单聊)、GROUP(群聊) | ZIMConversationType:Peer、Group、Room | ZIM 多一个 Room(房间)类型,用于直播 / 语聊房等实时场景 |
| 消息对象 | Message(createTextMessage 等工厂方法创建) | ZIMMessage 及子类(ZIMTextMessage、ZIMImageMessage 等,直接 new) | ZIM 消息子类按类型号区分(文本 1、图片 11、文件 12、音频 13、视频 14、合并 100、自定义 200 等) |
| 群组 | Work(好友工作群)、Public(陌生人社交群)、Meeting(临时会议群)、AVChatRoom(直播群) | 群组(Group)之外还有房间(Room)与社群(Community) | 腾讯的 AVChatRoom 场景在 ZIM 中可用 Room / 弹幕消息更直接地表达 |
| 历史消息 | getMessageList({ conversationID }) | queryHistoryMessage(conversationID, conversationType, config) | 均支持分页拉取服务端消息 |
| 服务端能力 | REST API(导入群消息、导入单聊消息等) | ZIM 服务端 API(zim-api.zego.im,批量注册用户、导入单聊 / 群聊消息等) | 两家都支持数据导入,是迁移的关键通道 |
2. 迁移路线图:四步走
整套迁移建议按「准备 → 数据 → SDK → 灰度」四个阶段推进,每阶段可独立验收:
┌─────────────────────────────────────────────────────────────────────┐
│ ① 前置准备 在 ZEGO 控制台创建项目 → 自助开通 ZIM 服务 │
│ 获取 AppID / AppSign / ServerSecret │
├─────────────────────────────────────────────────────────────────────┤
│ ② 账号与数据迁移 服务端按序导入: │
│ 账号 → 用户资料 → 好友 / 黑名单 │
│ → 单聊历史消息 → 群组与群聊历史消息 │
├─────────────────────────────────────────────────────────────────────┤
│ ③ 客户端 SDK 替换 按第 5 节逐模块替换: │
│ 初始化 → 登录 → 监听收消息 → 发消息 │
│ → 会话列表 → 历史消息 → 离线推送 / 多端登录 │
├─────────────────────────────────────────────────────────────────────┤
│ ④ 灰度与切换 新老 App 并行 → 灰度放量 → 确认数据一致 → 下架旧系统 │
└─────────────────────────────────────────────────────────────────────┘
说明:ZIM 官方迁移方案提供「强制升级」路径:完成向 ZIM 服务器同步数据后,强制将 App 从 1.0(旧系统)升级到 2.0(ZIM),随后旧系统下架。该方案实施简单,升级后无需长期维护新老双端兼容,适合绝大多数迁移场景。
3. 服务端数据迁移实战
数据迁移是迁移的核心,必须按顺序执行,因为后续步骤依赖前序数据已存在。ZIM 服务端接口以 HTTPS POST 方式调用,域名为 zim-api.zego.im,调用时通过 ?Action= 指定接口名。
3.1 导入顺序
- (首要)导入账号:调用「批量注册用户」接口,将存量账号全部导入 ZIM 后台。这是后续一切导入的前提。
- 导入用户资料:调用「修改用户资料」接口,导入昵称、头像、扩展字段等。
- 导入好友与黑名单:调用「批量添加好友」「批量拉黑用户」接口。注意 ZIM 中黑名单与好友互不相关 —— 两人可以既是好友又被互相拉黑。
- 导入单聊历史消息:调用 ImportPeerMsg(导入单聊消息)接口,按时间正序导入单聊会话消息。
- 导入群组与群聊历史消息:
- 先调用「创建群组」接口,把现有群组信息和群成员导入;
- 若群成员有误,用「添加群成员」「移除群成员」修正;
- 最后调用 ImportGroupMsg(导入群聊消息)接口导入历史群聊消息。
3.2 接口调用示例(导入群聊消息)
以导入群聊历史消息为例,REST 调用形如:
curl -X POST 'https://zim-api.zego.im/?Action=ImportGroupMsg' \
-H 'Content-Type: application/json' \
-d '{
"AppId": 1234567890,
"Signature": "<服务端签名>",
"GroupId": "group_10001",
"Messages": [
{
"SenderId": "user_1001",
"Timestamp": 1690000000,
"MsgType": 1,
"TextContent": "这是迁移前的第一条群消息"
}
]
}'
请求体中的 AppId、签名方式、字段结构以及各接口的调用频率限制(例如部分接口 QPS 为 20 次 / 秒),以 ZIM 服务端 API 官方文档为准。生产环境建议写一个顺序执行的迁移脚本:批量注册 → 资料 → 关系链 → 单聊消息 → 群组 → 群聊消息,每步记录断点,支持失败重跑。
3.3 多 App 数据合并
如果要把多个旧 App 的数据合并进一个 ZIM 应用:
- 用户资料:同一用户出现在多个 App 时,合并后一次性导入,重复导入会覆盖前一次结果。
- 关系链:不同 App 中的好友关系直接合并即可;若同一对好友在两个 App 中都存在,只导入一次,重复导入会失败。
- 单聊消息:同一对用户在不同 App 的聊天记录会合并进同一个会话,建议迁移前先在旧体系内完成合并。
- 群组:不同 App 不存在相同群,无合并问题。
4. 客户端 API 对照实战(Web / TypeScript)
以下用「腾讯云 IM → ZIM」逐模块对照。两套代码都基于 Web SDK:腾讯为 @tencentcloud/chat,ZIM 为 zego-zim-web(npm i zego-zim-web)。
4.1 初始化
腾讯云 IM
import TencentCloudChat from '@tencentcloud/chat';
// 同一个 SDKAppID 只会返回同一份实例
const chat = TencentCloudChat.create({ SDKAppID: 1400000000 });
chat.setLogLevel(1);
ZIM
import { ZIM, ZIMAppConfig } from 'zego-zim-web';
const config: ZIMAppConfig = { appID: 1234567890 };
ZIM.create(config); // 仅第一次调用会创建实例,之后返回 null
const zim = ZIM.getInstance(); // 通过单例获取,避免热更新后 create 返回 null
4.2 登录
腾讯云 IM:userSig 由你的服务端用密钥生成,客户端传 userID + userSig。登录成功后要等 SDK_READY 事件才能发消息。
chat.on(TencentCloudChat.EVENT.SDK_READY, () => {
// SDK 就绪,可以调 sendMessage 等接口
});
await chat.login({ userID: 'userA', userSig: 'xxx' });
ZIM:Token 同样由业务服务端用 ServerSecret 生成(控制台也可生成 24 小时有效的临时 Token 用于调试)。登录参数是 ZIMUserInfo + ZIMLoginConfig。
const userInfo = { userID: 'userA', userName: 'User A' };
const config = { token: 'xxx' };
await zim.login(userInfo, config);
4.3 监听收消息
腾讯云 IM
chat.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, (event) => {
// event.data 是 Message 数组
event.data.forEach((message) => {
console.log(message.from, message.payload.text);
});
});
ZIM
zim.on('messageReceived', (zim, result) => {
// result.messageList 是 ZIMMessage 数组
result.messageList.forEach((message) => {
console.log(message.senderUserID, message.messageContent);
});
});
4.4 发送单聊消息
腾讯云 IM:先 createTextMessage 构造消息,再 sendMessage。
const message = chat.createTextMessage({
to: 'userB',
conversationType: TencentCloudChat.TYPES.CONV_C2C, // 单聊
payload: { text: '你好,B' },
});
await chat.sendMessage(message);
ZIM:直接 new 消息子类,sendMessage 时指定会话 ID 与会话类型。
import { ZIMTextMessage, ZIMConversationType, ZIMMessageSendConfig } from 'zego-zim-web';
const textMessage = new ZIMTextMessage('你好,B');
const config = new ZIMMessageSendConfig();
const result = await zim.sendMessage(
textMessage,
'userB', // 会话 ID:单聊时为对方 userID
ZIMConversationType.Peer,
config
);
4.5 发送群聊消息
腾讯云 IM
const message = chat.createTextMessage({
to: 'groupID_10001',
conversationType: TencentCloudChat.TYPES.CONV_GROUP, // 群聊
payload: { text: '大家好' },
});
await chat.sendMessage(message);
ZIM
const textMessage = new ZIMTextMessage('大家好');
await zim.sendMessage(
textMessage,
'groupID_10001', // 群 ID
ZIMConversationType.Group,
config
);
4.6 会话列表与历史消息
腾讯云 IM
// 会话列表
const { data: { conversationList } } = await chat.getConversationList();
// 历史消息
const { data: { messageList } } = await chat.getMessageList({
conversationID: 'C2CuserB',
});
ZIM
// 会话列表
const result = await zim.queryConversationList({ count: 20 });
// 历史消息
const history = await zim.queryHistoryMessage(
'userB',
ZIMConversationType.Peer,
{ count: 20 }
);
差异点:ZIM 的历史消息查询必须同时传
conversationType;会话列表的增量更新通过onConversationChanged回调驱动,未读数通过onConversationTotalUnreadMessageCountUpdated回调维护。
结语
从腾讯云 IM 迁移到 ZIM,本质是一次概念对齐 + API 平移 + 数据搬迁:
- 概念层:SDKAppID ↔ AppID、UserSig ↔ Token、C2C/GROUP ↔ Peer/Group/Room,一一对应;
- 代码层:初始化、登录、监听、收发消息四大件在两边都是三五行代码的事,按第 5 节对照替换即可;
- 数据层:ZIM 服务端迁移接口支持账号、资料、关系链、单聊与群聊历史消息的完整导入,按顺序执行迁移脚本即可。
迁移窗口期内,建议新老 SDK 在客户端并行存在、按账号灰度放量,以 ZIM 侧数据完整性作为切换验收标准。数据校验通过后再下架旧系统,即可完成平滑切换。
参考资料
- ZIM Web SDK 功能总览:https://doc-zh.zego.im/zim-web/client-sdks/api-reference/function-list
- ZIM 实现基本消息收发:https://doc-zh.zego.im/zim-web/send-and-receive-messages
- ZIM 迁移方案(服务端数据导入):https://doc-zh.zego.im/zim-android/migration-solution
- ZIM 服务端 API 概览:https://doc-zh.zego.im/zim-server/overview
- ZIM 使用 Token 鉴权:https://doc-zh.zego.im/zim-web/guides/users/authentication
- 腾讯云 IM Web SDK 文档:https://web.sdk.qcloud.com/im/doc/v3/zh-cn/SDK.html




