当前位置: 首页 > article >正文

融云 swift 自定义消息类型

有的时候 官方提供的消息类型并不能满足我们的需求,所以我们要定义消息类型
融云官方文档

一. 先创建一个类继承RCMessageContent

class ChatRoomMessageContent: RCMessageContent {
}

二. 注册这个类

注意事项:
注册自定义消息代码必须在发送、接收该自定义消息之前
推荐将所有注册自定义消息代码放在 init 方法之后, connect 方法之前
注册的消息类型名, 必须多端一致, 否则消息无法互通
请勿使用 RC: 开头的类型名,以免和 SDK 默认的消息名称冲突
RCCoreClient.shared().registerMessageType(ChatRoomMessageContent.classForCoder())

三. 这个类如何实现

我项目里面用了SwiftyJSON, 所以这个地方也用了
我列举了IntStringBool类型,如果要用到senderUserInfo需要自己进行编解码。

import SwiftyJSON

class ChatRoomMessageContent: RCMessageContent {
    
    var gender: Int = 1
    var content: String = ""
    var isNew: Bool = false
    
    ///初始化
    override init() {
        super.init()
    }
    
    class func messageWithContent(_ content: String) -> ChatRoomMessageContent {
        let message = ChatRoomMessageContent()
        message.content = content
        return message
    }
    
    // NSCoding
   required init?(coder: NSCoder) {
       super.init()
       self.gender = coder.decodeInteger(forKey: "gender")
       self.content = "\(coder.decodeObject(forKey: "content") ?? "")"
       self.isNew = coder.decodeBool(forKey: "isNew")
   }
    
    override class func persistentFlag() -> RCMessagePersistent {
        return .MessagePersistent_ISPERSISTED
    }
    
    func encode(with coder: NSCoder) {
        coder.encode(self.gender, forKey: "gender")
        coder.encode(self.content, forKey: "content")
        coder.encode(self.isNew, forKey: "isNew")
    }
}

extension ChatRoomMessageContent {
    ///将消息内容编码成json
    override func encode() -> Data? {
        let dataDic: NSMutableDictionary = NSMutableDictionary()
        dataDic.setValue(self.gender, forKey: "gender")
        dataDic.setValue(self.content, forKey: "content")
        dataDic.setValue(self.isNew, forKey: "isNew")
        
        if senderUserInfo != nil {
            var userInfoDic = [String: Any]()
            userInfoDic["userId"] = senderUserInfo?.userId
            userInfoDic["name"] = senderUserInfo?.name
            userInfoDic["portrait"] = senderUserInfo?.portraitUri
            dataDic["senderUserInfo"] = userInfoDic
        }
        return try! JSONSerialization.data(withJSONObject: dataDic, options: .prettyPrinted)
    }
    
    ///将json解码生成消息内容
    override func decode(with data: Data) {
        let json = JSON(data)
        gender = json["gender"].intValue
        content = json["content"].stringValue
        isNew = json["isNew"].boolValue
        
        let userInfoDic = json["senderUserInfo"].dictionaryObject
        let userId = userInfoDic?["userId"] as? String ?? ""
        let name = userInfoDic?["name"] as? String
        let portrait = userInfoDic?["portrait"] as? String
        senderUserInfo = RCUserInfo(userId: userId, name: name, portrait: portrait)
    }
    
    //最后一条消息是自定义消息的时候,可以更改在会话列表显示的类型,为了区分消息类型
    override func conversationDigest() -> String? {
        return "[房间自定义消息]"
    }
    
    //定义的消息类型名,需要在各个平台上保持一致,以保证消息互通,别以 RC 开头,以免和融云系统冲突
    override class func getObjectName() -> String {
        return "RC:RoomCustom"//⚠️不要和系统冲突
    }
}

四. 发送自定义消息

let messageContent = ChatRoomMessageContent()
 messageContent.gender = 1
 messageContent.content = "内容"
 messageContent.isNew = isNew

 if let user = UserInfoService.shared.userInfo {
     messageContent.gender = user.gender.rawValue
 }
 messageContent.senderUserInfo = viewModel.userInfo
 let message = RCMessage(type: .ConversationType_CHATROOM, targetId: "\(viewModel.targetId)", direction: .MessageDirection_SEND, content: messageContent)
 
RCCoreClient.shared().send(message,
                                   pushContent: nil,
                                   pushData: nil) { message in
  debugPrint("消息已存入本地数据库\(String(describing: message))")
} successBlock: { message in
    debugPrint("成功-message:\(message)")
} errorBlock: { code, message in
    debugPrint("失败-code:\(code)------message:\(message)")
}

四. 接收

if let body = message.content as? ChatRoomMessageContent {
	print(body.gender)
	print(body.content)
	print(body.isNew)
}

http://www.kler.cn/a/148927.html

相关文章:

  • 任何使用 Keras 进行迁移学习
  • 前缀和技巧解析
  • 【AI日记】24.11.14 复习和准备 RAG 项目 | JavaScript RAG Web Apps with LlamaIndex
  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • 【数据结构与算法】第12课—数据结构之归并排序
  • HBase理论_背景特点及数据单元及与Hive对比
  • 第19章JAVA绘图
  • 自动化测试中几种常见验证码的处理方式及如何实现?
  • .net HttpClient封装
  • 项目:基于UDP的网络聊天室
  • WordPress自动采集伪原创发布工具
  • Docker 概述与安装
  • 基于YOLO模型建筑工地个人防护设备目标检测
  • 只会在终端使用Python运行代码?这些高级用法了解了解
  • 基于Python+OpenCV+dlib+Tensorflow深度学习的人脸表情识别系统
  • 【数据库】聊聊一颗B+树 可以存储多少数据
  • SpringBoot+VUE3前后端分离-【支付宝支付】
  • k8s中pod的hostport端口突然无法访问故障处理
  • Scrum敏捷开发流程及支撑工具
  • 【深入解析git和gdb:版本控制与调试利器的终极指南】
  • Linux 基础-常用的命令和搭建 Java 部署环境
  • 使用vue脚手架创建vue项目
  • Linux 安装 Minio 配置 HTTPS
  • LangChain 14 SequencialChain链接不同的组件
  • 19 Go的时间日期
  • c 数组简介