SDK 升级与兼容
本页说明 SDK 的版本语义、升级步骤与破坏性变更的识别方式。契约采用 additive-only 兼容策略:v1.x 只新增可选字段/枚举值/接口/事件/错误码,不改名、不改语义、不删除;破坏性变更走 v2。
制品与版本
| 平台 | 包 / 制品 | 语言 | 交付状态 |
|---|---|---|---|
| Web | @ni-paas/im-web | JavaScript / TypeScript | 已交付 |
| Android | io.nipaas.imlib / io.nipaas.imkit | Kotlin (JVM/Android) | 已交付(回调式) |
| Flutter | impaas_imlib / impaas_imkit | Dart | 已交付 |
| Electron | @ni-paas-im/electron | JavaScript / TypeScript(主进程 + preload) | 已交付 |
| Native | im-sdk (crate) + libim_sdk | C ABI(18 个操作) | 已交付(部分操作) |
| iOS / HarmonyOS | 契约预留 | Swift / ArkTS | 契约预留(不可运行) |
升级前先确认契约修订号:当前 IDL 版本 v1.0.0,冻结修订 rev35。SDK 的更新日志按修订记录新增能力;升级到更高修订只会新增方法,不会改动既有方法名与语义。
升级步骤
- 锁定目标版本并读更新日志
在依赖里锁定确切版本(不要用浮动的 latest);对照 各平台更新日志 确认新增能力。
重点关注:新增方法(可用即用)、新增枚举值(switch 需要 default 分支)、新增错误码(默认分支要能展示未知码)。
- 升级前自检
记录当前连接状态、消息收发、会话列表、未读、回调等关键路径的基线(可以用自动化脚本跑一遍冒烟)。
清理本地缓存/数据库前先确认升级是否需要迁移:Android/Electron 本地库由 SDK 管理,跨大版本升级时按更新日志执行迁移或重建。
- 升级并跑回归
先升一个端(建议 Web,回滚最快),验证:建连/重连、收发文本与媒体、历史分页、会话列表、未读与已读、扩展/回应/流式(若使用)。
再升 Android / Flutter / Electron;每个端都验证初始化参数未变(appkey/serverUrl/回调形态)。
- 灰度与回滚
按用户比例或内测渠道灰度;观察建连成功率、错误码分布(1002/3001/3002/3003)与崩溃率。
回滚 = 回退依赖版本 + 恢复本地库备份(如升级做过迁移)。因此升级脚本必须包含备份步骤。
破坏性变更识别
| 变更类型 | 是否兼容 | 客户端要做什么 |
|---|---|---|
| 新增方法 / 新增事件 | 兼容 | 按需接入;未接入不影响既有功能 |
| 新增可选参数 | 兼容 | 不传即默认值;不要依赖“参数不存在”的分支 |
| 新增枚举值 | 兼容 | switch/if 必须有 default 分支,否则新值会走进未知分支 |
| 新增错误码 | 兼容 | 统一错误展示要能显示未知码(不要硬编码错误文案表) |
| 方法改名 / 语义变化 | 不兼容(v2) | 按 v2 迁移指南改造;v1 与 v2 不可混用 |
| 删除字段 / 改数值 | 不兼容(v2) | 同上 |
升级后的自检代码
// 1) 版本与连接自检:升级后先跑最小闭环。
const status = await client.connect(token);
if (status.code !== 0) throw new Error(`connect failed: ${status.code}`);
// 2) 发送 + 历史 + 会话列表(三条主链路)。
const sent = await client.sendTextMessage(1, "user2", "upgrade smoke");
const history = await client.getHistoryMessages(1, "user2", { limit: 20 });
const conversations = await client.getConversationList();
// 3) 未知错误码兜底:不要因为新增错误码而崩溃。
function describe(code) {
return ERROR_TEXT[code] || `未知错误(${code}),请查看更新日志`;
}final code = await engine.connect(token, 10);
if (code != 0) throw Exception("connect failed: $code");
final sent = await engine.sendTextMessage(1, "user2", "upgrade smoke");
final history = await engine.getHistoryMessages(1, "user2", limit: 20);
final conversations = await engine.getConversationList();
// 升级后如果出现新枚举值,走 default 分支并上报,便于灰度期发现问题。
switch (message.content.type) {
case ContentType.text: break;
default: reportUnknownContentType(message.content.type);
}常见升级问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 初始化报参数错误 | 初始化选项字段变更或必填项缺失 | 对照「初始化」页的字段表;用最小参数先跑通 |
| 建连失败 1002 | Token 过期(7 天)或应用切换 | 重新签发 Token;确认 appkey 与签发时一致 |
| 收到未知错误码 | 新版新增错误码 | 兜底文案 + 上报;更新错误码表 |
| 本地库打不开/字段缺失 | 升级跨越大版本,表结构变化 | 按更新日志迁移或清理本地库后重新同步 |
| Flutter 编译失败 | Dart/Flutter SDK 版本约束变化 | 按 pubspec 约束升级 Flutter;查看迁移说明 |
| Electron 白屏 | preload 白名单或主进程服务未初始化 | 确认 initService 与 preload 暴露的方法一致 |
相关链接
- SDK 版本与兼容:兼容策略与平台状态
- 更新日志:按修订的新增能力
- 问题排查手册:升级后常见故障
- SDK 公开面与文档覆盖:升级后核对方法是否齐全