主题
使用 Demo 进行二次开发
最省事的做法不是从空项目重新拼接 IM,而是先运行 XHIM Demo,再逐步替换登录、页面和 业务消息。本页按实际开发顺序说明。
第一步:先运行原始 Demo
在修改代码前,先确认原始 Demo 能完成:
- 登录两个测试账号;
- 打开会话列表;
- 创建单聊并互发一条文本消息;
- 查看联系人和群组;
- 退出后重新登录,确认历史消息仍在。
如果原始 Demo 还不能完成这些步骤,先处理环境、账号或 Server 配置,不要同时修改页面。
第二步:替换成你的账号体系
保留 Demo 的 SDK 会话管理,只替换“业务登录成功后如何取得 XHIM 登录信息”这一段:
text
用户登录你的 App
-> 你的业务后台返回 XHIM 登录所需信息
-> 创建一个 XHIM Client
-> 先监听事件
-> 调用 connect
-> 连接成功后进入主界面Token 只保存在系统安全存储或短期内存中,不要放进页面参数、普通配置文件或日志。 同一个登录账号只保留一个 Client;切换账号时先关闭旧账号会话。
第三步:替换页面和主题
建议按功能逐页替换,不要一次删除整个 Demo:
- 替换颜色、字体、图标和导航;
- 替换会话列表的 Cell 或组件;
- 替换聊天页的气泡和输入区;
- 替换联系人、群组和个人资料页;
- 每替换一页就重新验证登录、收发消息和退出。
页面只调用平台公开 SDK,不要读取 SDK 数据库,也不要复制 Core 源码到 App。
第四步:接入页面数据
页面首次打开时查询一次数据,收到 SDK 事件后再重新查询受影响的列表:
text
打开会话页 -> 查询会话列表 -> 显示
收到会话变化事件 -> 再查询会话列表 -> 更新显示
打开聊天页 -> 查询本地消息 -> 显示
收到新消息事件 -> 再查询当前会话消息 -> 更新显示不要把事件保存成另一套消息数据库。分页返回的游标只需要原样传入下一页。
第五步:增加业务消息
订单、审批、红包或系统提醒建议使用版本化业务消息,并保留一段普通文字作为旧版本 无法识别时的提示:
text
消息类型 + 版本 + JSON 数据 + fallbackText页面只解析自己支持的版本。解析失败或收到未来版本时显示 fallbackText,不要让整条 消息消失。后台通知应使用 BusinessNotification,不要让普通用户账号模拟通知账号。
推荐目录
下面的目录适合 MVC、MVVM、MVP 等常见架构,可按平台习惯改名:
text
App/ App 启动、登录态和页面入口
SDK/ XHIM Client、事件监听和凭据读取
Features/
Conversations/ 会话列表
Chat/ 聊天页
Contacts/ 联系人
Groups/ 群组
Profile/ 个人资料
UI/ 主题、图标和通用组件
Tests/ 页面逻辑、SDK 合同和安装验证重点是让页面、SDK 会话和业务账号代码分开,方便以后替换 UI 或升级 SDK。
上线前自检
- [ ] 原始 Demo 和修改后的 App 都能用两个账号互发消息;
- [ ] 监听事件早于
connect; - [ ] 同一账号只有一个 Client;
- [ ] 退出或换号后,旧账号事件不会更新新页面;
- [ ] 页面退出时取消不再需要的请求和订阅;
- [ ] 日志不包含 Token、消息正文或业务通知数据;
- [ ] 未知消息类型会显示
fallbackText; - [ ] 在空白工程中可以只依赖正式 SDK 包完成构建。
从 客户端接入总览选择平台;具体方法、参数和完整示例请查 SDK API Reference。
独立 Demo 仓库
每个 Demo 都是独立仓库,可以单独克隆、构建和调试:
| 平台 | Demo |
|---|---|
| iOS | xhim-ios-app |
| Android(Java 为主) | xhim-android-app |
| HarmonyOS | xhim-harmony-app |
| macOS | xhim-macos-app |
| Windows | xhim-windows-app |
| Web | xhim-web-app |
| Electron | xhim-electron-app |
| Flutter | xhim-flutter-app |
| React Native | xhim-react-native-app |
| Unity | xhim-unity-app |
| uni-app | xhim-uni-app |
| 微信 / 通用小程序 | xhim-mini-program-app |
Demo 仓库只保存应用、UI、固定版 SDK 引用和测试,不提交 Token、管理员密钥、 服务端环境文件或开发机上的临时 Core 构建目录。