跳到主要内容

获取聊天室历史消息

IMLib SDK 支持获取聊天室历史消息。具体能力如下:

  • 通过 getHistoryMessagesByTime 接口获取聊天室保存在本地的历史消息。请注意,聊天室业务默认在用户退出聊天室时会清除聊天室保存在本地的历史消息。
  • 通过 getRemoteHistoryMessages 接口获取聊天室保存在服务端的历史消息。请注意,该功能依赖聊天室消息云端存储服务。

开通服务

使用 getRemoteHistoryMessages 要求开通 聊天室消息云端存储服务。使用前请确认已开通服务。开通后聊天室历史消息保存在云端,默认保存 2 个月。

获取聊天室本地历史消息

您可以通过 getHistoryMessagesByTime 获取聊天室本地的历史记录,聊天室业务默认在用户退出聊天室时会清除聊天室保存在本地的历史消息。。

接口原型

TypeScript
public getHistoryMessagesByTime(conId: ConversationIdentifier, option: IGetLocalMsgByTimeOption): Promise<IAsyncResult<List<Message>>>;

参数说明

参数名类型详细说明
conIdConversationIdentifier会话标识对象,需包含有效的会话类型和会话 targetId
optionIGetLocalMsgByTimeOption基于时间范围的消息查询配置

参数 IGetLocalMsgByTimeOption 的详细描述

TypeScript
/**
* 获取本地消息的配置
*
* beforeCount afterCount 总共分为四种情况
* ```
* 1. beforeCount > 0 && afterCount > 0,将获取 beforeCount + {time} + afterCount 的消息
* 2. beforeCount > 0 && afterCount == 0,将获取 beforeCount + {time} 的消息
* 3. beforeCount == 0 && afterCount > 0,将获取 {time} + afterCount 的消息
* 4. beforeCount == 0 && afterCount == 0,将获取 {time}
* ```
* @version 1.0.0
*/
interface IGetLocalMsgByTimeOption {
/**
* objectName 集合,为空的话代表获取所有类型的本地消息
*
* 有效值的话代表获取指定类型的消息
*/
objNameList?: List<string>,

/**
* 毫秒时间戳
* 初次可以传入当前时间: Date.now() 或者传入会话的 lastSentTime
* @see Conversation
*/
time: number,

/**
* 在 messageId 之前的消息个数,取值 ≥0
* @discussion beforeCount 如果传入 10 ,但是获取的个数不足时说明往前没有更多的消息了
*/
beforeCount: number,

/**
* 在 messageId 之后的消息个数,取值 ≥0
* @discussion afterCount 如果传入 10 ,但是获取的个数不足时说明往后没有更多的消息了
*/
afterCount: number,
}

示例代码

TypeScript
let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Chatroom;
conId.targetId = "会话 id";

let option: IGetLocalMsgByTimeOption = {
objNameList: objNameList,
time: time,
beforeCount: beforeCount,
afterCount: afterCount
}

IMEngine.getInstance().getHistoryMessagesByTime(conId, option)
.then(result => {
if (EngineError.Success !== result.code) {
// 获取消息失败
return;
}
if (!result.data) {
// 消息不存在
return;
}
// 消息列表
let msgList = result.data as List<Message>;
});

获取聊天室远端历史消息

您可以通过 getRemoteHistoryMessages 获取聊天室远端历史记录。如果本地数据库存在相同时段内的历史消息,那么调用这个接口会返回一个 size 为 0 的数组。

建议您先获取聊天室本地历史消息,在获取不到本地历史消息后,再调用 [getRemoteHistoryMessages] 方法,获取聊天室远端历史记录。

在查询方向不变的情况下,当次返回的 time 的值可以作为下次拉取时的 time 传入,方便连续拉取。

接口原型

TypeScript
public getRemoteHistoryMessages(conId: ConversationIdentifier, option: IGetRemoteMsgOption): Promise<IAsyncResult<List<Message>>>;

参数说明

参数名类型详细说明
conIdConversationIdentifier会话唯一标识,包含会话类型与会话 targetId
optionIGetRemoteMsgOption查询配置项

示例代码

TypeScript
    let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Chatroom;
conId.targetId = "聊天室 id";

let option: IGetRemoteMsgOption = {
time: Date.now(),
count: 10,
order: Order.Descending,
isCheckDup: true
}

IMEngine.getInstance().getRemoteHistoryMessages(conId, option)
.then(result => {
if (EngineError.Success !== result.code) {
// 获取聊天室消息失败
return;
}
if (!result.data) {
// 消息数据为空
return;
}
let msgList = result.data as List<Message>;
});