实现自定义消息收发

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

网易云信即时通讯 IM SDK 内置了包括图片,音频,视频等多媒体消息,但基于不同的应用场景,您可能需要某些特殊的消息类型,因此需要自定义消息类型。本文介绍了如何从 Model 到 UI,一步步实现自定义消息类型。

IM UIKit 的会话消息模块(NEChatUIKit)默认实现了文本消息、图片消息等 基本消息类型 的发送和展示。如果这些消息类型无法满足您的业务需求,您可 新增自定义消息类型

消息类型

应用中常见的基本消息类型如下所示:

消息类型
显示效果
是否需要额外集成
文本消息 否,集成会话界面即可用
图片消息 否,集成会话界面即可用
语音消息 否,集成会话界面即可用
视频消息 否,集成会话界面即可用
表情 否,集成会话界面即可用
文件消息 否,集成会话界面即可用发送文件消息需要访问 iCloud 服务,若您的系统低于 iOS 11,则需要提前配置相关权限,否则可能会出现异常。
具体配置操作如下请在 Xcode 中选择 TARGETS -> Signing&Capabilities -> iCloud,然后勾选 iCloud Documents
iCloud 权限
地理位置 是,参考 实现地理位置消息功能

前提条件

根据本文操作前,请确保您已经 集成会话消息界面

实现流程

步骤 1:创建自定义消息

swift    // type 字段必须指定,且不可为 101、102(UIKit 内部已使用),否则解析为 **未知消息体**
    let dataDic: [String: Any] = ["type": customMessageType]
    let dataJson = NECommonUtil.getJSONStringFromDictionary(dataDic)
    let customMessage = MessageUtils.customMessage(text: "this is a custom message",
                                                   rawAttachment: dataJson)

步骤 2:发送自定义消息

自定义消息的发送与其他消息类型的发送相同。

swift    ChatRepo.shared.sendMessage(message: customMessage, conversationId: viewModel.conversationId) { result, error, pro in
      if let err = error {
        print("send custom message error : ", err.localizedDescription)
      }
    }

步骤 3:接收自定义消息

当收到一条自定义消息时,您需要解析消息中的 attachment 对象(V2NIMMessageAttachment)的 raw 字段。

IM UIKit 提供了自定义消息解析工具类 NECustomAttachment,您可以快速解析 typedata 等自定义字段,更多用法请参考源码。

后续步骤

如果您需要在会话界面添加发送自定义消息的 UI 控件,可在单击 更多 按钮(见下图)后展示的区域增加相应的按钮。

image

自定义单元格(TableviewCell)

用户可自定义单元格,实现自定义消息的自定义展示。

实现步骤与示例代码(Swift):

  1. 继承 NEChatBaseCell 类,实现自定义单元格,对自定义消息进行展示。

    swift class CustomChatCell: NEChatBaseCell {
         public var testLabel = UILabel()
         ...
         override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
             super.init(style: style, reuseIdentifier: reuseIdentifier)
             selectionStyle = .none
             backgroundColor = .lightGray
             testLabel.translatesAutoresizingMaskIntoConstraints = false
             contentView.addSubview(testLabel)
             NSLayoutConstraint.activate([
             testLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor),
             testLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
             ])
             testLabel.font = UIFont.systemFont(ofSize: 14)
             testLabel.textColor = UIColor.black
         }
    
         override func setModel(_ model: MessageContentModel, _ isSend: Bool) {
             print("this is custom message")
             testLabel.text = model.message?.text
         }
     }
    
  2. 继承 P2PChatViewController 类,绑定自定义消息 cell

    swift    class CustomP2PChatViewController: P2PChatViewController {
            let customMessageType = 20
    
            override func viewDidLoad() {
    
                // 自定义消息 cell 绑定需要放在 super.viewDidLoad() 之前
                NEChatUIKitClient.instance.regsiterCustomCell(["\(customMessageType)": CustomChatCell.self])
    
                ...
    
                super.viewDidLoad()
            }
        }
    

    regsiterCustomCell 方法的入参类型为 [String: UITableViewCell.Type], 其中 key 需要与自定义消息中的 type 相对应,从而实现不同类型的自定义消息的对应展示。

  3. 发送自定义消息。

    swift    // type 字段必须指定,且不可为 101、102(UIKit 内部已使用),否则解析为 **未知消息体**
        let dataDic: [String: Any] = ["type": customMessageType]
        let dataJson = NECommonUtil.getJSONStringFromDictionary(dataDic)
        let customMessage = MessageUtils.customMessage(text: "this is a custom message, create time:\(Date.timeIntervalSinceReferenceDate)",
                                                    rawAttachment: dataJson)
    
        ChatRepo.shared.sendMessage(message: customMessage, conversationId: viewModel.conversationId) { result, error, pro in
        if let err = error {
            print("send custom message error : ", err.localizedDescription)
        }
        }
    

    自定义消息附件 JSON 中必须指定 type 字段,用于内部解析以及绑定 cell,从而实现不同类型的自定义消息的对应展示。

  4. 修改自定义 cell 高度。

    swift    class CustomP2PChatViewController: P2PChatViewController {
            let customMessageType = 20
            ...
    
            /// 获取消息模型,可在此处对消息体进行修改
            /// - Parameter model: 模型
            override func getMessageModel(model: any MessageModel) {
                super.getMessageModel(model: model)
    
                // 例如设置自定义消息高度
                if model.type == .custom {
                if model.customType == customMessageType {
                    model.height = 50
                }
                }
            }
        }
    

    消息展示前,可在 getMessageModel 方法中对消息进行修改,例如设置自定义消息 cell 的高度。 如果在构建自定义消息附近 JSON 时设置了 type 字段,则 UIKit 能够正确解析该自定义消息,customType 用于存储自定义消息子类型,可用于区分不同的自定义消息。

此文档是否对你有帮助?
有帮助
去反馈
  • 消息类型
  • 前提条件
  • 实现流程
  • 步骤 1:创建自定义消息
  • 步骤 2:发送自定义消息
  • 步骤 3:接收自定义消息
  • 后续步骤
  • 自定义单元格(TableviewCell)