获取历史消息(Electron)
- 本文档仅适用于 Electron 解决方案,仅限于配合 Electron 模块 (@rongcloud/electron 与 @rongcloud/electron-renderer)使用。
- 暂不支持聊天室和超级群会话类型
开通服务
从远端获取单群聊历史消息是指从融云服务端获取历史消息,该功能要求 App Key 已启用融云提供的单群聊消息云端存储服务。您可以在控制台 IM 服务的服务购买页面为当前使用的 App Key 开启服务。如果使用生产环境的 App Key,请注意仅 IM 旗舰版或 IM 尊享版可开通该服务。具体功能与费用以融云官方价格说明页面及计费说明文档为准。
提示:请注意区分历史消息记录与离线消息?。融云针对单聊、群聊、系统消息默认提供最多 7 天 (可调整)的离线消息缓存服务。客户端上线时 SDK 会自动收取离线期间的消息,无需 App 层调用 API。详见管理离线消息存储配置。
从本地数据库中获取消息
获取单条本地消息
通过调用 electronExtension.getLocalMessage 接口,可根据消息的 messageId 或 messageUId 从本地数据库中查询并返回完整的消息数据。
- SDK ≥ 5.16.0 版本支持。
- 该接口支持两种类型的参数:
number和string。- 如果参数为
number类型,则会将其视为messageId,并根据messageId从本地数据库中查询消息。 - 如果参数为
string类型,则会将其视为messageUId,并根据messageUId从本地数据库中查询消息。
- 如果参数为
接口
RongIMLib.electronExtension.getLocalMessage(messageUId);
参数说明
该方法支持两种参数类型:
- 当参数为 number 类型时,将视为 messageId,按消息 ID 查询本地消息。
- 当参数为 string 类型时,将视为 messageUId,按消息唯一 ID 查询本地消息。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
messageUId | string 或 number | 是 | 消息标识 |
示例代码
const messageUId = 'BS4O-P5AO-D1O6-9GPP';
const res = await RongIMLib.electronExtension.getLocalMessage(messageUId);
console.info('获取消息结果:', res);
获取会话中所有类型的消息
调用 getHistoryMessages 可拉取指定会话内的历史消息记录。
接口
RongIMLib.getHistoryMessages(conversation, option)
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
conversation | IConversationOption | 是 | 目标会话 |
option | GetHistoryMessageOption | 否 | 配置参数 |
- GetHistoryMessageOption 说明
参数 类型 说明 timestampnumber(可选)分页查询的时间边界。根据 order决定查询早于或晚于该时间戳的消息,传0表示从当前时间开始。countnumber( 可选)每次获取的消息数量。SDK < 5.7.4 范围为 [1-20],SDK ≥ 5.7.4 范围为 [1-100],默认值为 20。ordernumber(可选)查询方向:0 表示降序(从 timestamp 向前查找消息),1 表示升序(从 timestamp 向后查找消息)。
示例代码
const conversation = {
conversationType: RongIMLib.ConversationType.PRIVATE,
targetId: "<目标用户Id>"
}
// 从当前时间开始向前查询
const option = {
timestamp: 0,
count: 20,
order: 0
}
RongIMLib.getHistoryMessages(conversation, option).then(res => {
if (res.code === 0) {
console.log(res.data.list)
console.log(res.data.hasMore)
} else {
console.log(res.code, res.msg)
}
})
获取会话中指定类型的消息
调用 electronExtension.getHistoryMessagesByMessageTypes 方法,可拉取某个会话中指定类型的历史消息。
接口
RongIMLib.electronExtension.getHistoryMessagesByMessageTypes(conversation, option)
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
conversation | IConversationOption | 是 | 目标会话 |
option | GetHistoryMessageOption | 是 | 配置参数 |
示例代码
const conversation = {
conversationType: RongIMLib.ConversationType.PRIVATE,
targetId: "<目标用户Id>"
}
// 从当前时间开始向前查询
const options = {
timestamp: 0,
count: 20,
order: 0,
messageTypes: ['RC:TxtMsg']
}
RongIMLib.electronExtension.getHistoryMessagesByMessageTypes(conversation, option).then(res => {
if (res.code === 0) {
// res.data.messages 从 5.6.1 开始废弃,5.6.1 及之后版本请使用 res.data.list
console.log(res.data.list)
console.log(res.data.hasMore)
} else {
console.log(res.code, res.msg)
}
})
按日期统计本地消息数
从 5.48.0 版本开始,可调用 getMessageCountDetail,查询指定会话在时间范围内每日的本地消息数,用于展示消息日历或定位有消息的日期。
- 仅支持 Electron 平台,需先完成 SDK 初始化并登录。Web 和小程序平台不支持此接口,返回
ErrorCode.NOT_SUPPORT(35004)。 - 仅支持单聊、群聊、超级群和系统会话。
- 仅统计本地数据库中的消息,不会从服务器拉取消息。
接口
RongIMLib.getMessageCountDetail(identifier, options)
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
identifier | IConversationIdentifier | 是 | 目标会话标识,包含 conversationType、targetId 和可选的 channelId。频道 ID 按传入值精确匹配;空字符串不会转换为默认频道,查询超级群时请传入实际频道 ID。 |
options | IMessageCountDetailOptions | 是 | 查询时间范围,包含下列字段。 |
options.startTime | number | 是 | 开始时间戳,单位为毫秒,须为非负整数,包含该时刻。 |
options.endTime | number | 是 | 结束时间戳,单位为毫秒,须为非负整数,不包含该时刻,必须大于 startTime。 |
查询范围为 [startTime, endTime)。SDK 按查询时的系统时区划分自然日,一次最多查询 180 个自然日。如需查询完整日期,请将开始时间设为首日零点,结束时间设为最后一天的次日零点;首尾日期不完整时,仅统计落在查询区间内的消息。
返回值
返回 Promise<RCResult<IMessageCountDetail[]>>。调用成功时,res.data 为每日统计结果,按日期从新到旧排列,无消息的日期返回 messageCount: 0。
每日统计结果的数据类型为 IMessageCountDetail:
| 字段 | 类型 | 说明 |
|---|---|---|
dateMs | number | 该自然日零点的时间戳,单位为毫秒,使用查询时的系统时区。 |
messageCount | number | 该自然日内且位于查询区间中的本地消息数。 |
示例代码
const identifier = {
conversationType: RongIMLib.ConversationType.PRIVATE,
targetId: '<目标用户 ID>',
};
// 按本地时区查询最近 7 个自然日(含今天)
const endDate = new Date();
endDate.setHours(0, 0, 0, 0);
endDate.setDate(endDate.getDate() + 1);
const startDate = new Date(endDate);
startDate.setDate(startDate.getDate() - 7);
RongIMLib.getMessageCountDetail(identifier, {
startTime: startDate.getTime(),
endTime: endDate.getTime(),
}).then((res) => {
if (res.isOk) {
res.data.forEach(({ dateMs, messageCount }) => {
console.log(new Date(dateMs).toLocaleDateString(), messageCount);
});
} else {
console.log('查询失败:', res.code, res.msg);
}
});
获取远端历史消息
调用 getRemoteHistoryMessages 方法,可拉取指定会话中的远端历史消息记录。
接口
RongIMLib.getRemoteHistoryMessages(conversation, option)
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
conversation | IConversationOption | 是 | 目标会话 |
option | GetHistoryMessageOption | 否 | 配置参数 |
示例代码
const conversation = {
conversationType: RongIMLib.ConversationType.PRIVATE,
targetId: "<目标用户Id>"
}
// 从当前时间开始向前查询
const option = {
timestamp: 0,
count: 20,
order: 0
}
RongIMLib.getRemoteHistoryMessages(conversation, option).then(res => {
if (res.code === 0) {
console.log(res.data.list)
console.log(res.data.hasMore)
} else {
console.log(res.code, res.msg)
}
})
获取本地与远端历史消息
调用 getContinuousMessages 方法,可拉取指定会话中的连续的消息记录(包含本地消息和远端消息)。
getContinuousMessages 方法与 getRemoteHistoryMessages 的不同之处在于:
- 优先查询本地数据库中的消息;
- 若本地消息不足以满足查询条件,将继续从远端查询,确保返回一组连续、相邻的消息列表。
接口
RongIMLib.getContinuousMessages(conversation, option)
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
conversation | IConversationOption | 是 | 目标会话 |
option | GetHistoryMessageOption | 否 | 配置参数 |
如果您想继续查询更多历史消息,建议使用 res.data.timestamp 作为下次调用的 option.timestamp
示例代码
const conversation = {
conversationType: RongIMLib.ConversationType.PRIVATE,
targetId: "<目标用户Id>"
}
// 从当前时间开始向前查询
const option = {
timestamp: 0,
count: 20,
order: 0
}
RongIMLib.electronExtension.getContinuousMessages(conversation, option).then(res => {
if (res.code === 0) {
console.log(res.data.list)
console.log(res.data.hasMore)
// 如果您想继续查询更多历史消息,建议使用 res.data.timestamp 作为下次调用的 option.timestamp
console.log(res.data.timestamp)
} else {
console.log(res.code, res.msg)
}
})