Flutter

消息撤回

更新时间: 2024/11/21 17:18:39

NIM SDK 的MessageService类提供了监听消息撤回的方法和撤回消息的方法。SDK 支持多种撤回类型,如单聊单向撤回和群聊双向撤回,可通过revokeType设置。

功能介绍

撤回类型 说明
双向撤回 可双向撤回一定时间内(默认 2 分钟,可在云信控制台配置)的单聊消息与群聊消息。撤回之后,消息接收者和发送者都将收到一条消息撤回通知,并删除对应的离线消息、漫游消息和历史消息。
单向撤回 可以在一定时间内(默认 2 分钟,可在云信控制台配置)单向撤回单聊消息和群消息。撤回之后,消息接收者会收到一条单向撤回的通知,并删除对应的离线消息、漫游消息和历史消息;撤回之后,消息发送者无感知,可以正常使用漫游消息和历史消息。
  • 初始化SDK 时,配置NIMSDKOptions的参数shouldConsiderRevokedMessageUnreadCount为 true 可实现消息撤回后重新计算未读数。
  • 单聊和群聊消息的撤回功能存在些许区别:
    • 单聊:用户只能撤回自己发送的消息。
    • 群聊:普通群成员只能撤回自己发送的消息。客户端 SDK 支持管理员撤回其他群成员的消息(服务端 API 不支持)。

前提条件

已完成 SDK 初始化

实现流程

不同类型消息撤回的流程相似,本节以用户A(消息发送方)与 用户B(消息接收方)的单聊消息交互为例,介绍消息撤回的实现流程。

API调用时序

以下时序图仅以单聊双向撤回的场景为例。

sequenceDiagram



note over NIM SDK: 初始化
note over NIM SDK: 发送方注册监听并登录
用户A ->> NIM SDK: 监听消息状态变化
用户A ->> NIM SDK: 监听消息撤回<br>(onMessageRevoked)
用户A ->> NIM SDK: 登录
note over NIM SDK: 接收方注册监听并登录
用户B ->> NIM SDK: 监听消息状态变化
用户B ->> NIM SDK: 监听消息撤回<br>(onMessageRevoked)
用户B ->> NIM SDK: 监听消息接收
用户B ->> NIM SDK: 登录
note over NIM SDK: 发送消息
用户A ->> NIM SDK: 构造消息
用户A ->> NIM SDK: 发送消息
note over NIM SDK: 撤回消息
用户A ->> NIM SDK: 撤回消息<br>(revokeMessage)
NIM SDK ->> 用户A: 消息撤回的通知实体<br>(NIMRevokeMessage)
NIM SDK ->> 用户B: 消息撤回的通知实体<br>(NIMRevokeMessage)

流程说明

  1. 用户A 和 用户B 在登录 IM 前调用onMessageRevoked方法注册消息撤回的观察者,监听消息撤回的通知实体NIMRevokeMessage

    • NIMRevokeMessage参数说明

      参数
      类型
      说明
      attach String 消息附件
      customInfo Stirng 通过服务端 API(nimservermsg/recall.action)撤回消息时设置的 msg 字段。该字段表示消息撤回的相应描述,默认值为“撤回了一条信息”
      message NIMMessage 被撤回的消息
      notificationType int 消息撤回通知的类型:1 表示是离线,2 表示是漫游 , 默认 0 (表示在线)
      revokeType RevokeMessageType 消息撤回类型,分为单聊(点对点)双向撤回、群聊双向撤回、超大群双向撤回、单聊单向撤回和未定义(Windows 和 macOS 暂不支持)
      revokeAccount String 撤回消息的操作帐号
      callbackExt String 第三方扩展字段
    • 示例代码

      dartNimCore.instance.messageService.onMessageRevoked.listen((event) {
      print('Test_Observer onMessageRevoked ${event.toString()}');
      });
      
      
      
  2. 用户A 在发送消息后,调用revokeMessage方法撤回消息。调用成功后,SDK 会先触发回调通知应用上层消息撤回成功,再自动将本地的这条消息删除。如果需要在撤回后显示一条本方已撤回的提示,可自行构造一条提示消息并调用插入本地消息的方法

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

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

    参数
    类型
    说明
    message NIMMessage 待撤回的消息
    customApnsText String 可选,第三方透传消息推送文本,不填则不推送
    pushPayload Map<String, Object> 可选,第三方自定义的推送属性,限制 json 类型,长度 2048
    shouldNotifyBeCount bool 可选,撤回通知是否更新未读数(Windows 和 macOS 暂不支持)
    postscript String 可选,附言(Windows 和 macOS 暂不支持)
    attach String 可选,扩展字段

    示例代码如下

    dartNimCore.instance.messageService.revokeMessage(message: message);
    

相关特殊需求说明

针对撤回场景的通知栏内容覆盖需求(具体为:用户A 发消息给用户B,触发 APNs 推送,文案内容为“你好“。然后用户A 撤回该消息,此时通知栏中的“你好”变为预设的“对方撤回了一条消息”),建议的实现方式如下:

  • 在发送消息时,需要通过NIMMessage.pushPayload方法插入keyapns-collapse-id的键值对,value的内容建议使用uuid等字符串,用以唯一标识该消息。
  • 当要撤回这条消息时,在revokeMessage方法中传参customApnsText中设置覆盖文案,在pushPayload中插入与被撤回消息相同的apns-collapse-id键值对。

API参考

API
说明
onMessageRevoked 注册消息撤回事件流,监听消息撤回
revokeMessage 撤回消息
此文档是否对你有帮助?
有帮助
去反馈
  • 功能介绍
  • 前提条件
  • 实现流程
  • API调用时序
  • 流程说明
  • 相关特殊需求说明
  • API参考