Android

圈组消息撤回

更新时间: 2024/03/15 15:53:20

NIM SDK 的QChatMessageService接口提供圈组消息撤回的方法,支持在消息发送后将消息撤回。圈组的消息撤回功能属于双向撤回。撤回之后,消息接收者和发送者都将收到一条消息撤回通知。

消息发送方和拥有撤回他人消息权限(RECALL_MSG)的频道成员都可撤回消息。

前提条件

使用限制

圈组消息可撤回时长默认为 120s,即默认只能在消息发送后 2 分钟内撤回消息。

若需要扩展上限,可在控制台配置圈组子功能项(圈组消息可撤回时长),具体请参考开通和配置圈组功能

实现流程

流程概览

本文以 发送方的消息被频道成员A 撤回 为例进行介绍,即发送方在下文中为消息被撤回的一方。


以下时序图可能因为网络问题而显示异常。如显示异常,一般刷新当前页面即可正常显示。

uml diagram

具体流程

本节仅对上图中标为橙色的流程进行说明,其他流程请参考相关文档。例如:


  1. 注册回调函数并登录。

    • 双方在登录圈组前,注册observeMessageRevoke消息撤回状态观察者,监听消息撤回状态变化。
    • 频道成员A 在登录圈组前,注册observeReceiveMessage消息接收观察者,监听圈组消息接收。

    示例代码如下:

    注册消息接收观察者
    NIMClient.getService(QChatServiceObserver.class).observeReceiveMessage(new Observer<List<QChatMessage>>() {
        @Override
        public void onEvent(List<QChatMessage> qChatMessages) {
            //收到消息qChatMessages
            for (QChatMessage qChatMessage : qChatMessages) {
                //处理消息
            }
        }
    }, true);
    
    注册消息撤回状态变化观察者
    NIMClient.getService(QChatServiceObserver.class).observeMessageRevoke(new Observer<QChatMessageRevokeEvent>() {
        @Override
        public void onEvent(QChatMessageRevokeEvent event) {
            //收到撤回后的消息qChatMessage
            QChatMessage message = event.getMessage();
    
        }
    }, true);
    
    
  2. 频道成员A 接收到消息后,调用revokeMessage方法撤回消息。

    该方法入参结构QChatRevokeMessageParam必须传入更新操作通用参数、消息所属的服务器的ID(serverId)、消息所属的频道的 ID(channelId)、消息发送时间(注:并非当前时间)以及消息服务端ID。

    非消息发送方需要拥有撤回他人消息的权限,才能撤回消息。

    示例代码如下:

    NIMClient.getService(QChatMessageService.class).revokeMessage(new QChatRevokeMessageParam(updateParam,943445L,885305L,currentMessage.getTime(),currentMessage.getMsgIdServer()))
            .setCallback(new RequestCallback<QChatRevokeMessageResult>() {
                @Override
                public void onSuccess(QChatRevokeMessageResult result) {
                    //撤回成功,返回撤回后的消息
                    QChatMessage message = result.getMessage();
                }
    
                @Override
                public void onFailed(int code) {
                    //撤回失败,返回错误code
                }
    
                @Override
                public void onException(Throwable exception) {
                    //撤回异常
                }
            });
    
    
  3. observeMessageRevoke观察者回调函数触发,发送方和频道成员A 可通过该回调获取消息撤回通知。

    云信服务端不会下发“消息撤回通知”给发起撤回操作的设备,因为操作者不需要接收当前操作的通知。但如果操作者使用相同 IM 账号在其他设备登录,将收到该通知。

相关信息

圈组各端 (Android、iOS、Windows 和 含圈组版 Web)监听消息更新、消息撤回和消息删除的方式略有差异,具体为:Android 将消息更新、消息撤回和消息删除三个事件进行区分;而其他端的消息撤回和消息删除事件,都并入消息更新事件,不进行区分。

各端的相关事件回调接口如下:

Android iOS Windows 含圈组版 Web
监听消息更新 observeMessageUpdate onMessageUpdate: RegUpdatedCb messageUpdate
监听消息撤回 observeMessageRevoke
监听消息删除 observeMessageDelete
此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 使用限制
  • 实现流程
  • 流程概览
  • 具体流程
  • 相关信息