跳到主要内容

删除消息

用户成功发送了一条消息之后,可能发现消息内容错误等情况,希望删除消息。

用法

Global IM UIKit 默认启用删除功能。用户在会话页面长按消息(已发送成功的消息)可打开弹窗,点击删除后,可能的选项有在我的设备上删除或者在所有人的设备上删除。在所有的设备上删除后,一定时间内可以重新编辑。

alt(width=250) alt(width=250)

Global IM UIKit 默认实现了上图展示的消息删除功能:

  • 在我的设备上删除:从用户设备的本地消息数据库中删除该消息。开启了消息云存储后,当前用户云端历史消息记录中的对应消息也会一并被删除。
  • 在所有人的设备上删除:从消息发送者(当前用户)和消息接收者的消息记录中移除该消息,即撤回消息。默认在当前用户发送消息后 120 秒内允许操作,超过时限后不再展示该选项。删除成功后,IMLib SDK 会将设备本地消息数据库中的原始消息替换为一条撤回通知消息(RecallNotificationMessage)。。开启了消息云存储后,当前用户和所有消息接受者的云端历史消息记录中的对应消息也会一并被删除。

定制化

修改允许在所有人的设备上删除的时限

Global IM UIKit 默认允许在消息发送后 120 秒内在所有人的设备上删除。您可以通过全局配置调整该上限。

ConfigCenter.getChatConfig().getMessageDeleteOnAllDevicesInterval(120);

处理重新编辑按钮点击事件

  1. 继承 Global IM UIKit 的 MessageListComponent 创建子类,重写beforeCreateMsgActionView 方法。例如 CustomMessageListComponent

    public class CustomMessageListComponent extends MessageListComponent {

    public CustomMessageListComponent(Context context) {
    super(context);
    }

    public CustomMessageListComponent(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    }

    @Override
    protected List<MsgAction<UiMessage>> beforeCreateMsgActionView(List<MsgAction<UiMessage>> msgActions) {
    // 1. 移除删除按钮
    Iterator<MsgAction<UiMessage>> iterator = msgActions.iterator();
    while (iterator.hasNext()) {
    MsgAction<UiMessage> msgAction = iterator.next();
    if (msgAction instanceof DeleteMsgAction) {
    iterator.remove();
    }
    }

    // 2. 添加自定义的 CustomMsgAction 到指定位置
    msgActions.add(0, new CustomMsgAction());

    return msgActions;
    }
    }
  2. 复制 Global IM UIKit 的 rc_chat_module.xml 至主项目的 res/layout 中,找到 <com.rongcloud.im.uikit.chat.component.MessageListComponent /> 并替换为子类全路径 <com.rongcloud.im.uikit.custom.component.CustomMessageListComponent />

    更改前:

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.rongcloud.im.uikit.chat.component.MessageListComponent
    android:id="@+id/rc_message_list_component"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@id/fl_bottom"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/fl_header" />

    </FrameLayout>

    更改后:

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.rongcloud.im.uikit.custom.component.CustomMessageListComponent
    android:id="@+id/rc_message_list_component"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@id/fl_bottom"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/fl_header" />

    </FrameLayout>

如果已有实现无法满足您的需求,可以使用 IMLib SDK 中相关 API。详见以下文档:

在所有人的设备上删除消息的权限

危险

默认情况下,即时通讯服务对“在所有人的设备上删除消息”的操作者不作限制,这意味着如果您自定义处理 UI,可以允许 App 业务中的管理员角色用户撤回他人发送的消息,也可能因实现不当导致任何人都可以撤回他人发送的消息。

在定制化 Global IM UIKit 的删除消息功能时,如需限制在所有人的设备上删除消息的权限,可考虑以下方案

  • App 客户端重写 DeleteMsgAction#filter(@NonNull UiMessage uiMessage) 方法,可参照处理重新编辑按钮点击事件,根据业务需求,判断用户是否可以删除。
  • 如需避免用户撤回非本人发送的消息,可以提交工单申请打开 IMLib SDK 只允许撤回自己发送的消息。从融云服务端进行限制,禁止用户撤回非本人发送的消息。