删除消息
单聊会话、群聊会话的参与者可删除会话中的消息。IMKit 会话页面默认已实现了长按删除消息的功能,支持仅删除单条本地消息,或同步删除本地和远端的单条消息。
您可以修改 IMKit 会话页面长按消息菜单中删除按钮的行为,详见会话页面。如果 IMKit 的已有实现无法满足您的需求,可以直接使用 IMKit SDK 提供的删除消息接口。调用 IMKit 的删除 API 会同时触发会话列表和会话页面的刷新。
- App 用户的单聊会话、群聊会话、系统会话的消息默认仅存储在本地数据库中,仅支持从本地删除。如果 App(App Key/环境)已开通单群聊消息云端存储,该用户的消息还会保存在融云服务端(默认 6 个月),可从远端历史消息记录中删除消息。
- 针对单聊会话、群聊会话,如果通过任何接口以传入时间戳的方式删除远端消息,服务端默认不会删除对应的离线消息补偿(该机制仅会在打开多设备消息同步开关后生效)。此时如果换设备登录或卸载重装,仍会因为消息补偿机制获取到已被删除的历史消息。如需彻底删除消息补偿,请提交工单,申请开通删除服务端历史消息时同时删除多端补偿的离线消息。如果以传入消息对象的方式删除远端消息,则服务端一定会删除消息补偿中的对应消息。
同时删除本地与远端消息
使用以下接口可以同时删除本地数据库和服务端消息:
- 使用
deleteMessages
方法,并将是否删除远端消息的参数(cleanRemote
)置为true
。详见「删除本地消息」下的通过时间戳删除。 - 使用
deleteRemoteMessages
方法,详见「删除服务端消息」下的 通过消息删除。
删除本地消息
消息送达后会直接存入本地数据库,您可以调用接口从本地数据库中删除消息。删除消息同时触发会话列表和会话页面的刷新。
如果已经开通单群聊历史消息云端存储服务,从本地删除消息对服务端存储的历史消息无影响,客户端仍然可以从服务端拉取到本地已删除的历史消息。
如果希望仅删除本地消息,可使用 IMKit SDK 提供的以下能力:
- 通过指定消息 ID 等参数,删除指定单个会话在本地的消息记录中的一条或一组消息。
- 通过指定会话 ID 等参数,删除指定单个会话在本地的所有消息。
- 通过时间戳、会话 ID 等参数,删除指定单个会话在本地消息记录中早于指定时间点的消息。注意:通过时间戳删除消息的接口提 供一个删除远端消息的开关(
cleanRemote
),支持同时删除服务端的历史消息。
通过消息 ID 删除
使用 IMCenter
或 RongIM
的以下方法可通过消息 ID 删除指定会话在本地消息数据中的一条或一组消息,删除成功后会刷新会话和会话列表页面。请确保所提供的消息 ID 均属于同一会话。
IMCenter.getInstance().deleteMessages(conversationType, targetId, messageIds,callback);
参数 | 类型 | 说明 |
---|---|---|
conversationType | ConversationType | 会话类型 |
targetId | String | 会话 Id |
messageIds | int[] | 待删除的消息 ID 数组 |
callback | IRongCallback.ResultCallback<Boolean> | 接口回调 |
通过会话删除
使用 IMCenter
或 RongIM
的以下方法可删除指定单个会话在本地数据库中的全部消息。删除成功后会刷新会话和会话列表页面。
ConversationType conversationType = ConversationType.PRIVATE; //此处以单聊会话为例
String targetId = "会话 Id";
IMCenter.getInstance().deleteMessages(conversationType, targetId, new RongIMClient.ResultCallback<Boolean>() {
/**
* 删除消息成功回调
*/
@Override
public void onSuccess(Boolean bool) {
}
/**
* 删除消息失败回调
* @param errorCode 错误码
*/
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
}
});
参数 | 类型 | 说明 |
---|---|---|
conversationType | ConversationType | 会话类型 |
targetId | String | 会话 Id |
callback | IRongCallback.ResultCallback<Boolean> | 接口回调 |
通过时间戳删除
使用 IMCenter
的以下方法可通过时间戳、会话 ID 等参数,删除指定单个会话在本地消息记录中早于指定时间点的消息。删除成功后,会话列表页会刷新并删除此会话。
您需要提供一个时间戳,用于指定所需删除消息的时间范围。所有发送时间小于等于该时间戳的消息将被删除。如果这个时间戳值为 0,则删除该会话中的全部消息。
该方式同时提供一个开关(cleanRemote
),可以用来设置是否需要同时删除服务端的对应消息。您也可以使用同时删除本地与远端消息中介绍的其他方法。
ConversationType conversationType = ConversationType.PRIVATE;
String targetId = "会话 Id";
//此处以删除当前时间戳之前的消息为例,您也可以传入会话中最后一条消息的发送时间来进行删除操作。
long recordTime = System.currentTimeMillis();
IMCenter.getInstance().cleanHistoryMessages(conversationType, targetId, recordTime, false, new RongIMClient.OperationCallback() {
/**
* 删除消息成功回调
*/
@Override
public void onSuccess() {
}
/**
* 删除消息失败回调
* @param errorCode 错误码
*/
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
}
});