消息概览
了解 OpenIM iOS SDK 的消息创建、发送、接收与本地存储模型。
OpenIM iOS SDK 的消息能力围绕 OIMMessageInfo 展开。普通文本消息以及由本地媒体文件创建的消息,使用 OIMMessageInfo 对应的类方法创建后,通过发送消息发送;若媒体文件已经由业务端自行上传到对象存储并取得公开 URL,则使用对应的 URL 创建方法生成消息后,通过发送不经 OSS 的消息发送。
两条路径均支持发送到单聊或群聊;新消息到达、撤回、删除、已读回执、媒体上传进度和会话状态变化会通过对应的监听协议或 Delegate 同步到应用层。
在消息相关的界面和状态管理中,通常需要长期维护以下核心标识:
| 标识 | 用途 |
|---|---|
clientMsgID | 客户端生成的稳定消息唯一 ID,用于列表去重、状态更新、检索和分页游标。 |
conversationID | 会话记录 ID,用于历史消息关联、搜索与未读计数;应直接取自会话模型,不可从数组下标推导。 |
recvID | 单聊消息的接收方用户 ID;发送群聊消息时传 nil。 |
groupID | 群聊消息的目标群组 ID;发送单聊消息时传 nil。 |
消息类型
不同类型的聊天内容先通过对应的类方法生成 OIMMessageInfo 实例,发送层统一调用发送方法,无需为每种内容维护不同的网络请求通道。
消息类型对比
| 内容类型 | 典型用途 | 推荐任务文档 |
|---|---|---|
| 普通文本 | 发送纯文本聊天内容。 | 创建文本消息 |
| @ 提醒文本 | 群聊中提醒指定的一名或多名群成员。 | 创建 @ 消息 |
| 图片 | 从本地文件或已上传 URL 创建图片消息。 | 使用本地路径创建图片消息 |
| 音频 | 创建语音或音频消息。 | 使用本地路径创建音频消息 |
| 视频 | 创建带封面缩略图的视频消息。 | 使用本地路径创建视频消息 |
| 文件 | 创建普通附件文件消息。 | 使用本地路径创建文件消息 |
| 自定义消息 | 承载名片、邀请、红包、订单等业务结构化数据。 | 创建自定义消息 |
| Markdown | 发送包含 Markdown 排版格式的富文本。 | 创建 Markdown 消息 |
本地媒体由 SDK 上传时使用本地路径创建方法和发送消息;业务侧已具备文件存储服务并取得 URL 时,使用 URL 创建方法和发送不经 OSS 的消息,避免重复进入 SDK 内置上传链路。需要在多端共享的数据应写入消息载荷,仅影响当前设备渲染的私有状态写入 localEx。
OIMMessageInfo 常用属性
| 属性 | 类型 | 说明 |
|---|---|---|
clientMsgID | NSString * _Nullable | 客户端消息唯一 ID;非空时作为消息去重与合并的关键标识。 |
serverMsgID | NSString * _Nullable | 服务端消息 ID,不替代本地状态合并所用的 clientMsgID。 |
sessionType | OIMConversationType | 单聊或群聊会话类型,用于解析消息所属会话。 |
sendID | NSString * _Nullable | 消息发送者的用户 ID。 |
recvID | NSString * _Nullable | 消息接收者的用户 ID(单聊)。 |
groupID | NSString * _Nullable | 消息所属的群组 ID(群聊)。 |
contentType | OIMMessageContentType | 消息内容类型枚举,决定使用哪个 Element 元素进行解析与渲染。 |
sendTime | NSTimeInterval | 消息发送时间戳,用于本地时间轴排序,不能作为唯一去重标识。 |
status | OIMMessageStatus | 消息发送状态(发送中、成功、失败)。 |
isRead | BOOL | 当前消息的已读状态。 |
textElem、pictureElem、soundElem、videoElem、fileElem、atTextElem、customElem 等内容属性根据 contentType 填充。在渲染视图时应同时校验 contentType 与对应 Element 是否非空,在缺少预期内容时提供降级占位展示。
消息处理流程
- 使用
OIMMessageInfo的对应工厂方法在本地构建待发送消息对象。 - 调用发送消息或发送不经 OSS 的消息向单聊或群聊发送。
- 发送端在成功或进度回调中按
clientMsgID更新气泡状态;接收端通过OIMAdvancedMsgListener接收新消息。 - 进入聊天界面时先拉取历史消息快照,再持续监听新消息、撤回、删除与已读回执事件。
消息创建方法仅在本地内存中构造模型实例,不会产生网络交互,亦不触发任何事件通知。操作成功回调、远端事件到达以及重新拉取历史记录属于三个独立阶段,应用应分别处理。
会话路由规则
单聊消息发送时传入 recvID 并将 groupID 置为 nil;群聊消息发送时传入 groupID 并将 recvID 置为 nil。消息存入状态层后,统一以会话标识结合 clientMsgID 进行幂等去重与增量合并,禁止使用数组索引或文本摘要作为唯一标识。
功能导航
发送与接收
- 发送消息:发送本地消息对象,支持内置上传与进度监听。
- 发送不经 OSS 的消息:发送使用已上传媒体 URL 构建的消息。
- 接收消息:注册消息监听器,统一接收在线新消息与同步消息。
- 接收自定义业务消息:接收独立于会话流的业务自定义通知信令。
获取与检索
- 加载历史消息:以消息锚点分页向上翻页拉取历史消息。
- 反向加载历史消息:从历史锚点向下加载更新的消息。
- 读取消息上下文:以指定消息为中心同时读取前后上下文。
- 按 ID 查找消息:按
clientMsgID精准检索指定会话中的消息。 - 搜索消息:按关键字搜索本地已同步的聊天记录。
消息管理与已读
- 撤回消息:撤回已发送的消息并通知各端。
- 删除消息:删除本地已保存的单条消息。
- 批量删除消息:批量删除多条历史消息。
- 修改消息 商业版:编辑已发送成功的消息文本内容。
- 置顶或取消置顶消息 商业版:设置或取消会话内的消息置顶。
- 查询会话置顶消息 商业版:查询会话当前的置顶消息列表。
- 设置消息本地扩展:设置仅在本机有效的消息扩展字段。
- 上报群消息已读:向群聊发送群消息已读回执。
- 查询群消息已读成员:查询群消息的已读与未读成员明细。
辅助与转写
这个页面有帮助吗?