删除消息
针对单聊会话、群聊会话、系统会话,您可以通过 IMLib SDK 删除自己的历史消息,支持仅从本地数据库删除消息、仅从融云服务端删除自己的历史消息、或同时删除本地数据库以及融云服务端自己的历史消息。
SDK 的删除消息操作均指从当前登录用户的历史消息记录中删除一条或一组消息,不影响会话中其他用户的历史消息记录。
- App 用户的单聊会话、群聊会话、系统会话的消息默认仅存储在本地数据库中,仅支持从本地删除。如果 App(App Key/环境)已开通单群聊消息云端存储,该用户的消息还会保存在融云服务端(默认 6 个月),可从远端历史消息记录中删除消息。
- 针对单聊会话、群聊会话,如果通过任何接口以传入时间戳的方式删除远端消息,服务端默认不会删除对应的离线消息补偿(该机制仅会在打开多设备消息同步开关后生效)。此时如果换设备登录或卸载重装,仍会因为消息补偿机制获取到已被删除的历史消息。如需彻底删除消息补偿,请提交工单,申请开通删除服务端历史消息时同时删除多端补偿的离线消息。如果以传入消息对象的方式删除远端消息,则服务端一定会删除消息补偿中的对应消息。
- 针对单聊会话、群聊会话,如果 App 的管理员或者某普通用户希望在所有会话参与者的历史记录中彻底删除一条消息,应使用撤回消息功能。消息成功撤回后,原始消息内容会在所有用户的本地与服务端历史消息记录中删除。
- 客户端 SDK 不提供删除聊天室消息的接口。当前用户的聊天室本地消息在退出聊天室时会被自动删除。开通聊天室消息云端存储服务后,如需清除全部用户的聊天室历史消息,可使用服务端 API 清除消息。
- :::
仅从本地删除指定消息(消息 messageId)
您可以按消息的 messageId 删除存储在本地数据库内的消息。
- 待删除消息可以属于不同会话。
- 一次最多删除 1000 条消息。
如果您已经开通单群聊历史消息云存储服务,服务端保存的操作删除消息用户的历史消息记录不受影响。如果该用户从服务端获取历史消息,可能会获取到在本地已删除的消息。
接口原型
public eleteHistoryMessagesByIds(messageIds: List<number>): Promise<IAsyncResult<void>>;
参数说明
参数 | 类型 | 说明 |
---|---|---|
messageIds | List<number> | 消息的 ID 数组。详见消息介绍中的 MessageId 属性。 |
示例代码
let idList = new List<number>();
idList.add(1);
idList.add(2);
IMEngine.getInstance().deleteHistoryMessagesByIds(idList).then(result => {
if (EngineError.Success !== result.code) {
// 删除消息失败
return;
}
})
仅从本地删除会话全部历史消息
如果您需要本地清空自己的单聊、群聊 或系统会话的历史记录,可以删除指定会话保存在本地数据库中的全部消息。
如果您已经开通单群聊历史消息云存储服务,服务端保存的操作删除消息用户的历史消息记录不受影响。如果该用户从服务端获取历史消息,可能会获取到在本地已删除的消息。
该接口一次仅允许删除指定的单个会话的消息,会话由会话类型和会话 targetId 参数指定。
接口原型
public deleteMessages(conId: ConversationIdentifier): Promise<IAsyncResult<void>>;
参数说明
参数 | 类型 | 说明 |
---|---|---|
conId | ConversationIdentifier | 会话标识,由会话类型和会话 targetId 参数指定 |
示例代码
let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Private;
conId.targetId = "会话 Id";
IMEngine.getInstance().deleteMessages(conId).then(result => {
if (EngineError.Success !== result.code) {
// 删除消息失败
return;
}
});
仅从本地删除会话历史消息(时间戳)
如果您需要本地清空自己的单聊、群聊或系统会话的历史记录,可以删除指定会话保存在本地数据库中的特定时间前的消息。
如果您已经开通单群聊历史消息云存储服务,服务端保存的操作删除消息用户的历史消息记录不受影响。如果该用户从服务端获取历史消息,可能会获取到在本地已删除的消息。
接口原型
public deleteHistoryMessagesByTime(conId: ConversationIdentifier, sentTime: number): Promise<IAsyncResult<void>>;
参数说明
参数 | 类型 | 说明 |
---|---|---|
conId | ConversationIdentifier | 会话标识,由会话类型和会话 targetId 参数指定 |
time | number | 时间戳,毫秒 |
示例代码
let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Private;
conId.targetId = "会话 Id";
let time = Date.now();
IMEngine.getInstance().deleteHistoryMessagesByTime(conId, time).then(result => {
if (EngineError.Success !== result.code) {
// 删除消息失败
return;
}
})
仅从服务端删除会话历史消息(时间戳)
- 如果 App 已经开通单群聊历史消息云存储服务,您可以调用以下接口删除 App 用户在融云服务端的历史消息记录。该接口仅从服务端删除消息。
- 使用融云即时通讯服务端 API 也可以直接删除服务端消息。具体操作请参阅服务端文档消息清除。
App 用户可以仅删除指定会话保存在服务端的历史消息。该接口提供时间戳参数(sentTime
),支持删除早于指定时间的消息。如果 sentTime
设置为 0 则删除该会话保存在服务端的全部历史消息。
接口原型
public cleanRemoteHistoryMessagesByTime(conId: ConversationIdentifier, sentTime: number): Promise<IAsyncResult<void>>;
参数说明
参数 | 类型 | 说明 |
---|---|---|
conId | ConversationIdentifier | 会话标识 |
time | number | 时间戳,毫秒 |
示例代码
let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Private;
conId.targetId = "会话 Id";
let time = 0;
IMEngine.getInstance().cleanRemoteHistoryMessagesByTime(conId, time).then(result => {
if (EngineError.Success !== result.code) {
// 删除消息失败
return;
}
});
从本地以及服务端删除会话历史消息
- 如果 App 已经开通单群聊历史消息云存储服务,您可以调用以下接口删除 App 用户在融云服务端的历史消息记录。该接口仅从服务端删除消息。
- 使用融云即时通讯服务端 API 也可以直接删除服务端消息。具体操作请参阅服务端文档消息清除。
您可以删除指定会话保存在服务端的历史消息。该接口提供消息列表参数(sentTime
),支持删除指定一批消息。您也可以控制删除远端消息时是否删除本地消息。
接口原型
public deleteRemoteMessages(conId: ConversationIdentifier, msgList: List<Message>, isDeleteLocal: boolean): Promise<IAsyncResult<void>>;
参数说明
参数 | 类型 | 说明 |
---|---|---|
conId | ConversationIdentifier | 会话标识 |
msgList | Message 集合 | 消息列表 |
示例代码
let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Private;
conId.targetId = "会话 ID";
let msgList = new List<Message>();
for (let i = 0; i < 10; i++) {
// msg 必须是发送成功的消息,此处进行简写
let msg : Message;
msgList.add(msg);
}
// 是否删除本地消息
let isDeleteLocal = true;
IMEngine.getInstance().deleteRemoteMessages(conId, msgList, isDeleteLocal).then(result => {
if (EngineError.Success !== result.code) {
// 删除远端消息失败
return;
}
// 删除远端消息成功
})