消息回复实现方案

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

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

方案介绍

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

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

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

实现流程

  1. 创建一条文本消息。

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

    //创建回复消息的远程参数, target 代表被回复消息 NIMMessage 对象
    let yxReplyMsg: [String: Any] = [
    "idClient": target.messageId,
    "scene": target.session?.sessionType == .P2P ? "p2p" : "team",
    "from": target.from ?? "",
    "to": target.session?.sessionId ?? "",
    "idServer": target.serverID,
    "time": Int(target.timestamp) * 1000,
    ]
    if message.remoteExt == nil {
    message.remoteExt = [keyReplyMsgKey: yxReplyMsg]
    } else {
    message.remoteExt![keyReplyMsgKey] = yxReplyMsg
    }
    

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

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

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

    var replyId: String? = message.repliedMessageId // 兼容 thread 方案
    if let yxReplyMsg = message.remoteExt?[keyReplyMsgKey] as? [String: Any] {
    replyId = yxReplyMsg["idClient"] as? String
    }
    
    guard let messageId = replyId, !messageId.isEmpty else {
    return
    }
    
  5. 通过获取到消息的 idClient( iOS 端称为 messageId)或者 idServer(服务端产生的唯一ID,iOS 端称为serverID)来查询被回复的消息。

    //根据 messageId 查询本地数据库,被回复消息的内容
    if let message = ConversationProvider.shared.messagesInSession(session, messageIds: [messageId])?
    .first {
    ...
    }
    
此文档是否对你有帮助?
有帮助
去反馈
  • 方案介绍
  • 实现流程