实现自定义消息收发
更新时间: 2024/09/27 10:50:00
网易云信即时通讯 IM SDK 内置了包括图片,音频,视频等多媒体消息,但基于不同的应用场景,您可能需要某些特殊的消息类型,因此需要自定义消息类型。本文介绍了如何从 Model 到 UI,一步步实现自定义消息类型。
IM UIKit 的会话消息模块(NEChatUIKit
)默认实现了文本消息、图片消息等 基本消息类型 的发送和展示。如果这些消息类型无法满足您的业务需求,您可 新增自定义消息类型。
消息类型
应用中常见的基本消息类型如下所示:
消息类型 |
显示效果 |
是否需要额外集成 |
---|---|---|
文本消息 | 否,集成会话界面即可用 | |
图片消息 | 否,集成会话界面即可用 | |
语音消息 | 否,集成会话界面即可用 | |
视频消息 | 否,集成会话界面即可用 | |
表情 | 否,集成会话界面即可用 | |
文件消息 | 否,集成会话界面即可用具体配置操作如下请在 Xcode 中选择 TARGETS -> Signing&Capabilities -> iCloud,然后勾选 iCloud Documents。 |
|
地理位置 | 是,参考 实现地理位置消息功能 |
前提条件
根据本文操作前,请确保您已经 集成会话消息界面。
实现流程
步骤 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
,您可以快速解析 type
、data
等自定义字段,更多用法请参考源码。
后续步骤
如果您需要在会话界面添加发送自定义消息的 UI 控件,可在单击 更多 按钮(见下图)后展示的区域增加相应的按钮。
自定义单元格(TableviewCell)
用户可自定义单元格,实现自定义消息的自定义展示。
实现步骤与示例代码(Swift):
-
继承
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 } }
-
继承
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
相对应,从而实现不同类型的自定义消息的对应展示。 -
发送自定义消息。
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,从而实现不同类型的自定义消息的对应展示。
-
修改自定义 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
用于存储自定义消息子类型,可用于区分不同的自定义消息。