消息回复实现方案

更新时间: 2024/03/15 18:26:23

若您需要实现简单的回复功能,可以参考我们在 UIKit 上使用的回复逻辑,以实现简单的类微信的消息回复功能。

方案介绍

在回复的消息中通过扩展参数,保留被回复消息的相关内容。在消息体 NIMMessage 中可以通过 remoteExtension 参数来定义消息体中的远程传输的扩展信息,回复消息的内容就以 Map 形式保存在该消息体中,数据格式如下:

"yxReplyMsg": {
"idClient": "消息的UUID",//被回复消息本地产生的唯一ID
"from": "fromAccount",//被回复消息的发送者账号
"to": "sessionId",//会话ID
"time": 1683361848167,//被回复消息的发送时间,数据类型为 int
"scene": "P2P",//被回复消息的会话类型,P2P代表单聊,Team代表群里,会会话类型的String值
"idServer": "serverId" //被回复消息的serverID,服务端产生的消息唯一ID,数据类型为 String
}

在发送一条回复消息时,会将上述被回复消息的内容,设置到该消息的 remoteExtension 中。

实现流程

  1. 创建一条文本消息。

    var textMsg = await MessageBuilder.createTextMessage( sessionId: sessionId,
      sessionType: sessionType,
      text: '文本消息');
    
  2. 在文本消息中插入被回复消息内容。

    //创建回复消息的远程参数
      var msgInfo = ReplyMessageInfo(
          idClient: replyMsg.uuid!,
          scene: replyMsg.sessionType?.name,
          to: replyMsg.sessionId,
          from: getIt<LoginService>().userInfo?.userId,
          idServer: replyMsg.serverId?.toString(),
          time: replyMsg.timestamp);
     //将回复信息设置到要发送的消息中
          message.remoteExtension![ChatMessage.keyReplyMsgKey] = msgInfo.toMap();
    

    上述示例中回复消息的 key 值,ReplyMessageInfo类已经定义,可以直接使用。定义如下所示:

      ///回复消息的key
      static const keyReplyMsgKey = 'yxReplyMsg';
    
  3. 发送消息。

    ChatMessageRepo.sendMessage(message: message, resend: resend)
    
  4. 对接收到的消息进行解析,根据 remoteExtension 中的值来判断是否包含被回复的消息。

    String? _getReplyMessageId(ChatMessage message) {
    var replyMessageInfoMap =
        message.nimMessage.remoteExtension?[ChatMessage.keyReplyMsgKey] as Map?;
    if (replyMessageInfoMap != null) {
      return ReplyMessageInfo.fromMap(
              replyMessageInfoMap.cast<String, dynamic>())
          .idClient;
    }
    return null;
    }
    
  5. 通过获取到消息的 idClient或者 idserver(服务端产生的唯一ID)来查询被回复的消息。

    var messageResult = await NimCore.instance.messageService
      .queryMessageListByUuid([replayMessageId], sessionId, sessionType);
    
此文档是否对你有帮助?
有帮助
去反馈
  • 方案介绍
  • 实现流程