消息撤回

更新时间: 2024/11/20 15:33:15

NetEase IM SDK(以下简称 NIM SDK) 支持消息撤回,包括单聊消息撤回和群聊消息撤回。

本文介绍如何调用 NIM SDK 的接口实现消息撤回。

  • 除通知消息(Notification) 类型外,其他消息类型都可被撤回。
  • 撤回的消息必须是已发送成功的消息。

支持平台

本文内容适用的开发平台或框架如下表所示:

Android iOS macOS/Windows Web/uni-app/小程序 Node.js/Electron HarmonyOS Flutter
✔️️️ ✔️️️ ✔️️️ ✔️️️ ✔️️️ ✔️️️ ✔️️️

功能描述

云信 IM 支持两种消息撤回类型:单向撤回和双向撤回。

客户端的撤回操作默认是 双向撤回 类型,单向撤回需要通过新版服务端 API 实现,具体请参考 消息撤回

撤回类型 说明
双向撤回 可双向撤回一定时间内(默认 2 分钟,可在云信控制台配置)的单聊消息与群聊消息。撤回之后,消息接收者和发送者都将收到一条消息撤回通知,并删除对应的离线消息、漫游消息和历史消息。
单向撤回 可以单向撤回 30 天内的单聊消息和高级群消息。撤回之后,消息接收者会收到一条单向撤回的通知,并删除对应的离线消息、漫游消息和历史消息;撤回之后,消息发送者无感知,可以正常使用漫游消息和历史消息。
  • 若撤回的消息,接收者还未读,那么对于接收者来说,应用内的总未读数会减 1。
  • 单聊和群聊消息的撤回功能存在些许区别:
    • 单聊:用户只能撤回自己发送的消息。支持撤回自己发送给自己的消息。
    • 群聊:普通群成员只能撤回自己发送的消息。客户端 SDK 支持管理员撤回其他群成员的消息(服务端 API 不支持)。

前提条件

  • 需要撤回的消息已发送成功,消息发送具体请参考 消息收发

  • 已在控制台开通消息撤回相关功能,具体请参考 配置消息功能

    • 撤回消息覆盖策略(默认不覆盖原始消息的推送)
    • 消息撤回时长(默认 2 分钟)
  • 已完成 SDK 初始化。

撤回消息

本节以单聊场景的交互为例,介绍消息撤回的实现流程。

API 调用时序

sequenceDiagram
par  步骤 1:发送方注册监听并登录 
消息发送方 ->> NIM: 监听消息撤回<br>(addMessageListener)<br>(onMessageRevokeNotifications)
消息发送方 ->> NIM: 登录
end
par  步骤 2:接收方注册监听并登录 
消息接收方 ->> NIM: 监听消息接收<br>(addMessageListener)<br>(onReceiveMessages)
消息接收方 ->> NIM: 监听消息撤回<br>(addMessageListener)<br>(onMessageRevokeNotifications)
消息接收方 ->> NIM: 登录
end
par  步骤 3:发送消息 
消息发送方 ->> NIM: 构建消息<br>(createTextMessage) 
消息发送方 ->> NIM: 发送消息<br>(sendMessage) 
NIM ->> 消息接收方:投递消息
end
par  步骤 4:撤回消息 
消息发送方 ->> NIM: 撤回消息<br>(revokeMessage)
NIM ->> 消息发送方: 投递撤回通知
NIM ->> 消息接收方: 投递撤回通知
end

实现流程

以下仅介绍主要步骤,登录,消息发送等常见步骤省略,具体请参考 登录 IM消息收发 文档。

  1. 消息发送者和接收者在登录 IM 前监听消息撤回回调事件,消息接收者还需监听消息接收回调事件。

    Android/iOS/macOS/Windows

    调用 addMessageListener 方法注册消息监听器,监听消息撤回回调事件 onMessageRevokeNotifications 和消息接收回调事件 onReceiveMessages

    Android
    javaV2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class);
    
    V2NIMMessageListener messageListener = new V2NIMMessageListener() {
        @Override
        public void onMessageRevokeNotifications(List<V2NIMMessageRevokeNotification> revokeNotifications) {
    
        }
    
        @Override
        public void onReceiveMessages(List<V2NIMMessage> messages) {
    
        }
    };
    
    v2MessageService.addMessageListener(messageListener);
    
    iOS
    objective-c[[[NIMSDK sharedSDK] v2MessageService] addMessageListener:listener];
    
    macOS/Windows
    cppV2NIMMessageListener listener;
    listener.onMessageRevokeNotifications = [](std::vector<V2NIMMessageRevokeNotification> revokeNotifications) {
        // receive message revoke notifications
    };
    listener.onReceiveMessages = [](std::vector<V2NIMMessage> messages) {
        // receive messages
    };
    messageService.addMessageListener(listener);
    

    Web/uni-app/小程序/Node.js/Electron/HarmonyOS

    调用 on("EventName") 方法注册消息相关监听器,监听消息撤回事件onMessageRevokeNotifications 和消息接收回调事件 onReceiveMessages

    Web/uni-app/小程序
    typescriptnim.V2NIMMessageService.on("onMessageRevokeNotifications", function(revokeNotifications: V2NIMMessageRevokeNotification[]) {})
    nim.V2NIMMessageService.on("onReceiveMessages", function(messages: V2NIMMessage[]) {})
    
    Node.js/Electron
    typescriptv2.messageService.on("messageRevokeNotifications", function (revokeNotifications: V2NIMMessageRevokeNotification[]) {})
    v2.messageService.on("receiveMessages", function (messages: V2NIMMessage[]) {})
    
    HarmonyOS
    typescriptnim.messageService.on("onMessageRevokeNotifications", function(revokeNotifications: V2NIMMessageRevokeNotification[]) {})
    nim.messageService.on("onReceiveMessages", function(messages: V2NIMMessage[]) {})
    

    Flutter

    调用 add 方法注册消息监听器,监听消息撤回事件onMessageRevokeNotifications 和消息接收回调事件 onReceiveMessages

    dartsubsriptions.add(NimCore
        .instance.messageService.onMessageRevokeNotifications
        .listen((event) {
    //do something
    }));
    subsriptions.add(
        NimCore.instance.messageService.onReceiveMessages.listen((event) {
    //do something
    }));
    
  2. 消息发送者在发送消息成功后,调用 revokeMessage 方法撤回该条已发送成功的消息。撤回成功后,SDK 会先触发回调通知应用上层消息撤回成功,再自动将本地的该条消息删除。

    如果需要在撤回后显示一条本方已撤回的提示,可自行构造一条提示消息(createTipsMessage)并调用 insertMessageToLocal 方法在本地插入一条提示,具体可参考 插入本地消息

    以下情况消息撤回会失败:

    • 消息为空
    • 消息未发送成功
    • 消息超过撤回时限
    • 消息被反垃圾(内容审核)命中

    示例代码:
    Android
    V2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class);
    V2NIMMessage revokeMessage = ; // 被撤回的消息
    // TODO: 根据实际情况配置
    V2NIMMessageRevokeParams revokeParams = V2NIMMessageRevokeParams.V2NIMMessageRevokeParamsBuilder.builder()
    .withEnv()
    .withExtension()
    .withPostscript()
    .withPushContent()
    .withPushPayload()
    .build();
    
    v2MessageService.revokeMessage(revokeMessage, revokeParams,
        new V2NIMSuccessCallback<Void>() {
            @Override
            public void onSuccess(Void unused) {
                // TODO: 撤回成功
            }
        },
        new V2NIMFailureCallback() {
            @Override
            public void onFailure(V2NIMError error) {
                // TODO: 撤回失败
            }
        }
    );
    
    iOS
    // 参数设置文档 V2NIMMessageRevokeParams
    V2NIMMessageRevokeParams *revokeParams = [[V2NIMMessageRevokeParams alloc] init];
    
    [[[NIMSDK sharedSDK] v2MessageService] revokeMessage:message
                                            revokeParams:revokeParams
                                                success:^{
                                                // 发送成功回调
                                                }
                                                failure:^(V2NIMError * _Nonnull error) {
                                                // 发送失败回调, error 包含错误原因
    }];
    
    macOS/Windows
    cppV2NIMMessage message;
    // ...
    
    V2NIMMessageRevokeParams params;
    messageService.revokeMessage(
        message,
        params,
        []() {
            // revoke message succeeded
        },
        [](V2NIMError error) {
            // revoke message failed, handle error
        }
    );
    
    Web/uni-app/小程序
    try {
    await nim.V2NIMMessageService.revokeMessage(message)
    // todo Success
    } catch (err) {
    // todo error
    }
    
    Node.js/Electron
    typescripttry {
    await v2.messageService.revokeMessage(message, {})
    // todo Success
    } catch (err) {
    // todo error
    }
    
    HarmonyOS
    try {
    await nim.messageService.revokeMessage(message)
    // todo Success
    } catch (err) {
    // todo error
    }
    
    Flutter
    dartawait NimCore.instance.messageService.revokeMessage(message, revokeParams);
    
  3. 撤回成功后,消息发送者和接收者会通过回调接收到消息撤回通知。

    撤回消息后,云信会删除对应的离线消息、漫游消息和历史消息。

涉及接口

Android/iOS/macOS/Windows
API 说明
addMessageListener 注册消息相关监听器
removeMessageListener 取消注册消息相关监听器
revokeMessage 撤回消息
createTipsMessage 创建一条提示消息
insertMessageToLocal 插入一条消息到本地数据库
V2NIMMessageRevokeNotification 撤回通知对象
Web/uni-app/小程序/Node.js/Electron/HarmonyOS
API 说明
on("EventName") 注册消息相关监听器
off("EventName") 取消注册消息相关监听器
revokeMessage 撤回消息
createTipsMessage 创建一条提示消息
insertMessageToLocal 插入一条消息到本地数据库Web/uni-app/小程序 不支持该接口。
V2NIMMessageRevokeNotification 撤回通知对象
Flutter
API 说明
add 注册消息相关监听器
cancel 取消注册消息相关监听器
revokeMessage 撤回消息
createTipsMessage 创建一条提示消息
insertMessageToLocal 插入一条消息到本地数据库
NIMMessageRevokeNotification 撤回通知对象
此文档是否对你有帮助?
有帮助
去反馈
  • 支持平台
  • 功能描述
  • 前提条件
  • 撤回消息
  • API 调用时序
  • 实现流程
  • 涉及接口