圈组消息撤回
更新时间: 2024/03/15 15:53:20
NIM SDK 的QChatMessageService
接口提供圈组消息撤回的方法,支持在消息发送后将消息撤回。圈组的消息撤回功能属于双向撤回。撤回之后,消息接收者和发送者都将收到一条消息撤回通知。
消息发送方和拥有撤回他人消息权限(RECALL_MSG
)的频道成员都可撤回消息。
前提条件
- 已开通圈组功能。
- 已完成圈组初始化。
使用限制
圈组消息可撤回时长默认为 120s,即默认只能在消息发送后 2 分钟内撤回消息。
若需要扩展上限,可在控制台配置圈组子功能项(圈组消息可撤回时长),具体请参考开通和配置圈组功能。
实现流程
流程概览
本文以 发送方的消息被频道成员A 撤回 为例进行介绍,即发送方在下文中为消息被撤回的一方。
以下时序图可能因为网络问题而显示异常。如显示异常,一般刷新当前页面即可正常显示。
具体流程
本节仅对上图中标为橙色的流程进行说明,其他流程请参考相关文档。例如:
-
注册回调函数并登录。
- 双方在登录圈组前,注册
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);
- 双方在登录圈组前,注册
-
频道成员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) { //撤回异常 } });
-
observeMessageRevoke
观察者回调函数触发,发送方和频道成员A 可通过该回调获取消息撤回通知。云信服务端不会下发“消息撤回通知”给发起撤回操作的设备,因为操作者不需要接收当前操作的通知。但如果操作者使用相同 IM 账号在其他设备登录,将收到该通知。
相关信息
圈组各端 (Android、iOS、Windows 和 含圈组版 Web)监听消息更新、消息撤回和消息删除的方式略有差异,具体为:Android 将消息更新、消息撤回和消息删除三个事件进行区分;而其他端的消息撤回和消息删除事件,都并入消息更新事件,不进行区分。
各端的相关事件回调接口如下:
Android | iOS | Windows | 含圈组版 Web | |
---|---|---|---|---|
监听消息更新 | observeMessageUpdate |
onMessageUpdate: |
RegUpdatedCb |
messageUpdate |
监听消息撤回 | observeMessageRevoke |
|||
监听消息删除 | observeMessageDelete |