即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。
本文介绍如何实现用户从消息服务器获取和删除会话和消息。
即时通讯 IM SDK 支持你通过调用方法获取和删除服务器获取历史消息,提供以下功能:
开始前,请确保满足以下条件:
你可以调用 getConversationlist
方法从服务端分页获取会话列表,每个会话包含最新一条历史消息。
// pageNum:当前页面,从 1 开始。
// pageSize:每页获取的会话数量。取值范围为 [1,20]。
connection.getConversationlist({pageNum: 1, pageSize: 20}).then((res) => {})
对于使用 getConversationlist
方法未实现分页获取会话的用户,SDK 默认可拉取 7 天内的 10 个会话,每个会话包含最新一条历史消息。如需调整时间限制或会话数量,请联系 sales@agora.io。
你可以调用 getHistoryMessages
方法从服务器获取指定会话的消息(消息漫游)。你可以指定消息查询方向,即明确按服务器接收消息的时间顺序或时间倒序获取消息。为确保数据可靠,我们建议你每次获取少于 50 条消息,可多次获取。
var options = {
// 对方的用户 ID 或者群组 ID 或聊天室 ID。
targetId:'user1',
// (可选)每页期望获取的消息条数。取值范围为 [1,50],默认值为 `20`。
pageSize: 20,
// (可选)查询的起始位置。若该参数设置为 `-1`、`null` 或空字符串,从最新消息开始。
cursor: -1,
// (可选)会话类型:(默认) `singleChat`:单聊;`groupChat`:群聊。
chatType:'groupChat',
// 消息搜索方向:(默认)`up`:按服务器收到消息的时间的逆序获取;`down`:按服务器收到消息的时间的正序获取。
searchDirection: 'up',
}
WebIM.conn.getHistoryMessages(options).then((res)=>{
// 成功获取历史消息。
console.log(res)
}).catch((e)=>{
// 获取失败。
})
你可以调用 removeHistoryMessages
方法按照时间或消息 ID 单向删除服务端的历史消息。每次最多可删除 50 条消息。消息删除后,消息删除后,该用户无法从服务端拉取到该消息。其他用户不受该操作影响。多端多设备登录时,删除成功后会触发 onMultiDeviceEvent#deleteRoaming
回调。
示例代码如下:
// 按时间戳删除历史消息
connection.removeHistoryMessages({targetId: 'userId', chatType: 'singleChat', beforeTimeStamp: Date.now()})
// 按消息 ID 删除历史消息
connection.removeHistoryMessages({targetId: 'userId', chatType: 'singleChat', messageIds: ['messageId']})
你可以调用 deleteConversation
方法删除服务器端会话和历史消息。会话删除后,当前用户和其他用户均无法从服务器获取该会话。若该会话的历史消息也删除,所有用户均无法从服务器获取该会话的消息。
let options = {
// 会话 ID:单聊为对方的用户 ID,群聊为群组 ID。
channel: "channel",
// 会话类型:(默认) `singleChat`:单聊;`groupChat`:群聊。
chatType: "singleChat",
// 删除会话时是否同时删除服务端漫游消息。
deleteRoam: true,
};
WebIM.conn
.deleteConversation(options)
.then((res) => {
console.log(res);
})
.catch((e) => {
// 删除失败。
});