浏览 SDKs · iOS
平台
SDKsiOS含商业版能力

消息概览

了解 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 常用属性

属性类型说明
clientMsgIDNSString * _Nullable客户端消息唯一 ID;非空时作为消息去重与合并的关键标识。
serverMsgIDNSString * _Nullable服务端消息 ID,不替代本地状态合并所用的 clientMsgID。
sessionTypeOIMConversationType单聊或群聊会话类型,用于解析消息所属会话。
sendIDNSString * _Nullable消息发送者的用户 ID。
recvIDNSString * _Nullable消息接收者的用户 ID(单聊)。
groupIDNSString * _Nullable消息所属的群组 ID(群聊)。
contentTypeOIMMessageContentType消息内容类型枚举,决定使用哪个 Element 元素进行解析与渲染。
sendTimeNSTimeInterval消息发送时间戳,用于本地时间轴排序,不能作为唯一去重标识。
statusOIMMessageStatus消息发送状态(发送中、成功、失败)。
isReadBOOL当前消息的已读状态。

textElem、pictureElem、soundElem、videoElem、fileElem、atTextElem、customElem 等内容属性根据 contentType 填充。在渲染视图时应同时校验 contentType 与对应 Element 是否非空,在缺少预期内容时提供降级占位展示。

消息处理流程

  1. 使用 OIMMessageInfo 的对应工厂方法在本地构建待发送消息对象。
  2. 调用发送消息或发送不经 OSS 的消息向单聊或群聊发送。
  3. 发送端在成功或进度回调中按 clientMsgID 更新气泡状态;接收端通过 OIMAdvancedMsgListener 接收新消息。
  4. 进入聊天界面时先拉取历史消息快照,再持续监听新消息、撤回、删除与已读回执事件。

消息创建方法仅在本地内存中构造模型实例,不会产生网络交互,亦不触发任何事件通知。操作成功回调、远端事件到达以及重新拉取历史记录属于三个独立阶段,应用应分别处理。

会话路由规则

单聊消息发送时传入 recvID 并将 groupID 置为 nil;群聊消息发送时传入 groupID 并将 recvID 置为 nil。消息存入状态层后,统一以会话标识结合 clientMsgID 进行幂等去重与增量合并,禁止使用数组索引或文本摘要作为唯一标识。

功能导航

发送与接收

获取与检索

消息管理与已读

辅助与转写