消息回复实现方案

更新时间: 2024/09/27 10:50:00

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

方案介绍

在回复的消息中通过扩展参数,保留被回复消息的相关内容。在消息体 V2NIMMessage 中可以通过 serverExtension 来获取和设置消息体中的远程传输的扩展参数,回复消息的内容就以 NSDictionary 形式保存在该消息体中,数据格式如下:

json"yxReplyMsg": {
    "idClient": "消息的 ID,唯一标识",//被回复消息本地产生的唯一 ID
    "from": "fromAccount",//被回复消息的发送者账号
    "to": "sessionId",//会话 ID
    "time": 1683361848167,//被回复消息的发送时间,数据类型为 Int,单位为毫秒
    "scene": 1,//被回复消息的会话类型,1 代表单聊,2 代表群聊,会话类型的 Int 值
    "idServer": serverId //被回复消息的 serverID,服务端产生的消息唯一 ID
}

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

实现流程

  1. 创建一条文本消息。

    swiftlet message = V2NIMMessage()
    message.text = "这是一条文本消息"
    
  2. 在文本消息中插入被回复消息内容。

    swift//创建回复消息的远程参数,replyMessage 代表被回复消息 NIMMessage 对象。
    let yxReplyMsg: [String: Any] = [
        "idClient": replyMessage.messageClientId as Any,
        "scene": replyMessage.conversationType.rawValue,
        "from": replyMessage.senderId as Any,
        "to": replyMessage.conversationId as Any,
        "idServer": replyMessage.messageServerId as Any,
        "time": Int(replyMessage.createTime * 1000),
        ]
    
        var remoteExt = NECommonUtil.getDictionaryFromJSONString(message.serverExtension ?? "") as? [String: Any]
        if remoteExt == nil {
        remoteExt = [keyReplyMsgKey: yxReplyMsg]
        } else {
        remoteExt![keyReplyMsgKey] = yxReplyMsg
        }
        message.serverExtension = NECommonUtil.getJSONStringFromDictionary(remoteExt ?? [:])
    

    上述示例中的 keyReplyMsgKey 为回复内容的 key,已在常量中定义,可以直接使用。

    swiftpublic let keyReplyMsgKey = "yxReplyMsg"
    
  3. 发送消息。

    swiftChatRepo.shared.sendMessage(message: message,
                                conversationId: conversationId,
                                completion)
    
  4. 对接收到的消息进行解析,根据 idClient 或者 idServer 来判断是否包含回复内容。

    swiftvar replyId: String? = message.threadReply?.messageClientId // 兼容 thread 方案
    let replyDic = ChatMessageHelper.getReplyDictionary(message: message)
    replyId = replyDic?["idClient"] as? String
    
  5. 通过扩展内容拼接 V2NIMMessageRefer 来查询被回复的消息。

    swiftlet refer = ChatMessageHelper.createMessageRefer(replyDic)
    ChatRepo.shared.getMessageListByRefers([refer], completion)
    
此文档是否对你有帮助?
有帮助
去反馈
  • 方案介绍
  • 实现流程