跳到主要内容

删除消息

单聊会话、群聊会话的参与者可删除会话中的消息。IMKit 会话页面默认已实现了长按删除消息的功能,支持仅删除单条本地消息,或同步删除本地和远端的单条消息。

您可以修改 IMKit 会话页面长按消息菜单中删除按钮的行为,详见会话页面。如果 IMKit 的已有实现无法满足您的需求,可以直接使用 IMKit SDK 提供的删除消息接口。调用 IMKit 的删除 API 会同时触发会话列表和会话页面的刷新。

提示
  • App 用户的单聊会话、群聊会话、系统会话的消息默认仅存储在本地数据库中,仅支持从本地删除。如果 App(App Key/环境)已开通单群聊消息云端存储,该用户的消息还会保存在融云服务端(默认 6 个月),可从远端历史消息记录中删除消息。
  • 针对单聊会话、群聊会话,如果通过任何接口以传入时间戳的方式删除远端消息,服务端默认不会删除对应的离线消息补偿(该机制仅会在打开多设备消息同步开关后生效)。此时如果换设备登录或卸载重装,仍会因为消息补偿机制获取到已被删除的历史消息。如需彻底删除消息补偿,请提交工单,申请开通删除服务端历史消息时同时删除多端补偿的离线消息。如果以传入消息对象的方式删除远端消息,则服务端一定会删除消息补偿中的对应消息。

同时删除本地与远端消息

使用以下接口可以同时删除本地数据库和服务端消息:

  • 使用 deleteMessages 方法,并将是否删除远端消息的参数(cleanRemote)置为 true。详见「删除本地消息」下的通过时间戳删除
  • 使用 deleteRemoteMessages 方法,详见「删除服务端消息」下的 通过消息删除

删除本地消息

消息送达后会直接存入本地数据库,您可以调用接口从本地数据库中删除消息。删除消息同时触发会话列表和会话页面的刷新。

提示

如果已经开通单群聊历史消息云端存储服务,从本地删除消息对服务端存储的历史消息无影响,客户端仍然可以从服务端拉取到本地已删除的历史消息。

如果希望仅删除本地消息,可使用 IMKit SDK 提供的以下能力:

  • 通过指定消息 ID 等参数,删除指定单个会话在本地的消息记录中的一条或一组消息。
  • 通过指定会话 ID 等参数,删除指定单个会话在本地的所有消息。
  • 通过时间戳、会话 ID 等参数,删除指定单个会话在本地消息记录中早于指定时间点的消息。注意:通过时间戳删除消息的接口提供一个删除远端消息的开关(cleanRemote),支持同时删除服务端的历史消息。

通过消息 ID 删除

使用 IMCenterRongIM 的以下方法可通过消息 ID 删除指定会话在本地消息数据中的一条或一组消息,删除成功后会刷新会话和会话列表页面。请确保所提供的消息 ID 均属于同一会话。

IMCenter.getInstance().deleteMessages(conversationType, targetId, messageIds,callback);
参数类型说明
conversationTypeConversationType会话类型
targetIdString会话 Id
messageIdsint[]待删除的消息 ID 数组
callbackIRongCallback.ResultCallback<Boolean>接口回调

通过会话删除

使用 IMCenterRongIM 的以下方法可删除指定单个会话在本地数据库中的全部消息。删除成功后会刷新会话和会话列表页面。

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) {

}
});
参数类型说明
conversationTypeConversationType会话类型
targetIdString会话 Id
callbackIRongCallback.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) {

}
});

参数类型说明
conversationTypeConversationType会话类型
targetIdString会话 Id
recordTimelong时间戳。 传 0 清除所有消息;非 0 则清除小于等于 recordTime 的消息
cleanRemoteboolean是否删除服务器端消息。传 true 删除服务端消息。传 false 不删除。
callbackOperationCallback接口回调

删除服务端消息

IMKit SDK 删除服务端消息的接口会同时从服务端与本地删除消息。如果希望仅删除服务端消息,请另行参考以下方法:

  • 使用即时通讯服务端 API。详见即时通讯服务端 API 文档消息清除
  • 直接使用 IMLib 中提供的方法,删除指定会话中早于某个时间点的消息。参见通过时间戳删除。注意,IMLib 方法并不提供页面刷新能力,您需要根据业务需求自定义通知机制进行页面刷新。

如果希望 IMKit 同时删除本地与服务端消息,可使用以下方法:

  • 使用上文描述的 deleteMessages 方法,传入时间戳、会话 ID 等参数,设置同时删除远端(cleanRemotetrue),删除指定单个会话中早于指定时间点的消息。详见上文通过消息 ID 删除
  • 使用 deleteRemoteMessages,通过指定消息对象等参数,删除指定单个会话在本地与远端的消息记录中的一条或一组消息。详见下文通过消息删除

通过消息删除

使用 IMCenter 的以下方法可通过指定会话类型、会话 ID 和消息对象数组,同时删除服务端与本地数据库中单个会话内的一条或者一组消息。删除成功后会触发页面刷新,会话或会话列表页面会同时移除被删消息。请确保所提供的消息 ID 均属于同一会话。

ConversationType conversationType = ConversationType.PRIVATE;//此处以单聊会话为例。
String targetId = "会话 Id";
Message[] messages = {message1, message2};

IMCenter.getInstance().deleteRemoteMessages(conversationType, targetId, messages, new RongIMClient.OperationCallback() {
/**
* 删除消息成功回调
*/
@Override
public void onSuccess() {

}
/**
* 删除消息失败回调
* @param errorCode 错误码
*/
@Override
public void onError(RongIMClient.ErrorCode errorCode) {

}
});
参数类型说明
conversationTypeConversationType会话类型。不支持聊天室。
targetIdString会话 Id
messagesMessage[]要删除的消息数组
callbackIRongCallback.ResultCallback<Boolean>接口回调

出于安全与性能考虑,我们对接口做出了一些限制。

  • 首先,从客户端接口删除服务端数据的操作具有一定的危险性,因此客户端接口一次删除操作仅能删除单个会话内的消息。
  • 其次,出于性能考虑,对于 Android 端,一次最多删除 100 条消息。