删除消息
单聊会话、群聊会话的参与者可删除会话中的消息。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) {
}
});
参数 | 类型 | 说明 |
---|---|---|
conversationType | ConversationType | 会话类型 |
targetId | String | 会话 Id |
recordTime | long | 时间戳。 传 0 清除所有消息;非 0 则清除小于等于 recordTime 的消息 |
cleanRemote | boolean | 是否删除服务器端消息。传 true 删除服务端消息。传 false 不删除。 |
callback | OperationCallback | 接口回调 |
删除服务端消息
IMKit SDK 删除服务端消息的接口会同时从服务端与本地删除消息。如果希望仅删除服务端消息,请另行参考以下方法:
- 使用即时通 讯服务端 API。详见即时通讯服务端 API 文档消息清除。
- 直接使用 IMLib 中提供的方法,删除指定会话中早于某个时间点的消息。参见通过时间戳删除。注意,IMLib 方法并不提供页面刷新能力,您需要根据业务需求自定义通知机制进行页面刷新。
如果希望 IMKit 同时删除本地与服务端消息,可使用以下方法:
- 使用上文描述的
deleteMessages
方法,传入时间戳、会话 ID 等参数,设置同时删除远端(cleanRemote
为true
),删除指定单个会话中早于指定时间点的消息。详见上文通过消息 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) {
}
});
参数 | 类型 | 说明 |
---|---|---|
conversationType | ConversationType | 会话类型。不支持聊天室。 |
targetId | String | 会话 Id |
messages | Message[] | 要删除的消息数组 |
callback | IRongCallback.ResultCallback<Boolean> | 接口回调 |
出于安全与性能考虑,我们对接口做出了一些限制。
- 首先,从客户端接口删除服务端数据的操作具有一定的危险性,因此客户端接口一次删除操作仅能删除单个会话内的消息。
- 其次,出于性能考虑,对于 Android 端,一次最多删除 100 条消息。