消息撤回

更新时间: 2024/04/17 15:00:35

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

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

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

功能描述

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

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

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

前提条件

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

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

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

撤回消息

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

API 调用时序

uml diagram

实现流程

以下仅介绍主要步骤,登录,消息发送等常见步骤省略,具体请参考登录 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/小程序/Harmony

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

    Web/uni-app/小程序
    typescriptnim.V2NIMMessageService.on("onMessageRevokeNotifications", function(revokeNotifications: V2NIMMessageRevokeNotification[]) {})
    nim.V2NIMMessageService.on("onReceiveMessages", function(messages: V2NIMMessage[]) {})
    
    Harmony
    typescriptnim.messageService.on("onMessageRevokeNotifications", function(revokeNotifications: V2NIMMessageRevokeNotification[]) {})
    nim.messageService.on("onReceiveMessages", function(messages: V2NIMMessage[]) {})
    
  2. 消息发送者在发送消息成功后,调用 revokeMessage 方法撤回该条已发送成功的消息。撤回成功后,SDK 会先触发回调通知应用上层消息撤回成功,再自动将本地的该条消息删除。

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

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

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

    参数说明:

    Android
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 需要撤回的消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    params V2NIMMessageRevokeParams null 消息撤回配置参数,包括撤回的推送文案、推送内容、附言等配置。
    success V2NIMSuccessCallback - 消息撤回成功回调。
    failure V2NIMFailureCallback - 消息撤回失败回调,返回错误码
    iOS
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 需要撤回的消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    params V2NIMMessageRevokeParams null 消息撤回配置参数,包括撤回的推送文案、推送内容、附言等配置。
    success V2NIMSuccessCallback - 消息撤回成功回调。
    failure V2NIMFailureCallback - 消息撤回失败回调,返回错误码
    macOS/Windows
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 需要撤回的消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    params V2NIMMessageRevokeParams null 消息撤回配置参数,包括撤回的推送文案、推送内容、附言等配置。
    success V2NIMSuccessCallback - 消息撤回成功回调。
    failure V2NIMFailureCallback - 消息撤回失败回调,返回错误码
    Web/uni-app/小程序
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 需要撤回的消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    params V2NIMMessageRevokeParams null 消息撤回配置参数,包括撤回的推送文案、推送内容、附言等配置。
    Harmony
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 需要撤回的消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    params V2NIMMessageRevokeParams null 消息撤回配置参数,包括撤回的推送文案、推送内容、附言等配置。

    示例代码:

    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
    }
    
    Harmony
    try {
    await nim.messageService.revokeMessage(message)
    // todo Success
    } catch (err) {
    // todo error
    }
    
  3. 撤回成功后,消息发送者和接收者会通过回调接收到消息撤回通知 V2NIMMessageRevokeNotification

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

此文档是否对你有帮助?
有帮助
去反馈
  • 功能描述
  • 前提条件
  • 撤回消息
  • API 调用时序
  • 实现流程