融云 SDK 消息结构详解
本文档将详细介绍融云的 SDK 消息体系结构,以便于您更深入的了解融云并更快速的开发自己的产品。
会话与消息的关系
融云 Android、iOS、桌面版 SDK 中已经默认包含了消息数据的本地存储机制,开发者不再需要自己进行消息的存储。也就是说,在融云 SDK 收到消息后,先在本地进行了数据存储,然后再通过消息接收事件通知给开发者。开发者可以通过一系列接口读取和操作本地存储的消息数据。
会话实体和消息实体
会话实体类和消息实体类是用来存储本地会话和消息的容器类,除了包含会话内容和消息内容外,还包括了保存在本地的各种状态。
用来存储消息的实体类主要有 Conversation(会话) 和 Message(消息) 两个实体类,您在客户端读取消息时,获取的对象都和这两个类相关。会话有多种类型,可以是私聊会话,也可以是群组会话等,每一个 Conversation(会话)包含多条 Message(消息),关系如下图所示:
如何标识一个会话
通过 conversationType 和 targetId,可以唯一确定一个会话。ConversationType 枚举值意义和对应的 targetId 意义为:
会话名称
会话类型枚举 ConversationType
对应的 targetId
单聊
PRIVATE
用户的 Id(userId)
群组
GROUP
群组的 Id(groupId)
聊天室
CHATROOM
聊天室的 Id(chatroomId)
客服
CUSTOMER_SERVICE
客服的 Id(customerServiceId)
系统会话
SYSTEM
系统账户 Id。可以理解为 QQ 的 10000 号的角色
应用公众服务
APP_PUBLIC_SERVICE
应用公众服务的 Id(publicServiceId)
公众服务
PUBLIC_SERVICE
公众服务的 Id(publicServiceId)
请注意区分会话类型和消息类型,会话类型是针对会话的分类,不同的会话类型决定了不同的会话逻辑。
另:系统会话类型并不一定代表是“系统消息”,本质上与单聊会话类型没有区别,只是逻辑上做了不同的区分,便于展开不同的产品业务逻辑。
消息的定义
消息类(MessageContent 的子类)不同于消息实体类(Message),消息类代表一条具体的消息内容,消息实体类是消息类的外层容器,消息实体对象是消息对象在本地存储的外层对象,消息实体对象除了包含消息对象外,还包括消息的方向、接收状态、接收时间、发送者等。
融云单条消息大小不超过 128k
消息基类
MessageContent 是融云的消息基类,所有消息类都继承于 MessageContent 类。需要注意的是,MessageContent 类和 Message 类之间的关系:Message 中包含了一个具体的继承自 MessageContent 的消息,就是 Content 属性,可以通过 setContent() 和 getContent() 进行存取。
约定:如果您要定义一个内容类消息(需要显示在聊天会话界面中,且不是通知类消息),请从 MessageContent 类继承,命名为 XxxxxMessage。
内容消息表示一个用户间发送的包含具体内容的消息,需要展现在聊天界面上,如文字消息、语音消息等。
消息的分类
消息分类
消息行为状态标识
内容类消息
表示一个用户间发送的包含具体内容的消息,需要展现在聊天界面上,如文字消息、语音消息等。
通知类消息
表示一个通知信息,可能展现在聊天界面上,如提示条通知。
状态类消息
表示一个状态,用来实现如“对方正在输入”的功能。
信令类消息
融云在实现 SDK 自身业务功能时使用的,开发者不需要对其做任何处理。
内容类消息
消息类型
ObjectName
类名
是否计数
是否存储
RC:TxtMsg
TextMessage
是
是
RC:VcMsg
VoiceMessage
是
是
RC:HQVCMsg
HQVoiceMessage
是
是
RC:ImgMsg
ImageMessage
是
是
RC:GIFMsg
GIFMessage
是
是
RC:ImgTextMsg
RichContentMessage
是
是
RC:FileMsg
FileMessage
是
是
RC:LBSMsg
LocationMessage
是
是
RC:SightMsg
SightMessage
是
是
RC:PSImgTxtMsg
PublicServiceRichContentMessage
是
是
RC:PSMultiImgTxtMsg
PublicServiceMultiRichContentMessage
是
是
注:为了符合 iOS 平台的命名规则,在 iOS SDK 中类名前增加 RC 前缀,如:RCTextMessage。
通知类消息
消息类型
ObjectName
类名
是否计数
是否存储
RC:ContactNtf
ContactNotificationMessage
否
是
RC:ProfileNtf
ProfileNotificationMessage
否
是
RC:CmdNtf
CommandNotificationMessage
否
是
RC:InfoNtf
InformationNotificationMessage
否
是
RC:GrpNtf
GroupNotificationMessage
否
是
RC:ReadNtf
ReadReceiptMessage
否
否
RC:PSCmd
PublicServiceCommandMessage
否
否
RC:CmdMsg
CommandMessage
否
否
注:为了符合 iOS 平台的命名规则,在 iOS SDK 中类名前增加 RC 前缀,如:RCCommandMessage。
状态类消息
消息类型
ObjectName
类名
是否计数
是否存储
RC:TypSts
TypingStatusMessage
否
否
RC:RRRspMsg
ReadReceiptResponseMessage
否
否
注:为了符合 iOS 平台的命名规则,在 iOS SDK 中类名前增加 RC 前缀,如:RCTypingStatusMessage。
是否计数:表示客户端收到消息后,是否进行未读消息计数(未读消息数增加 1),所有内容型消息都应该设置此值。
是否存储:表示客户端收到消息后,是否进行存储,并在之后可以通过接口查询。
内置内容类消息
文字消息
用来发送文字类消息,其中可以包括表情、超链接(会自动识别),客户端收到消息后计入未读消息数、进行存储。
消息类名:TextMessage
消息 ObjectName:RC:TxtMsg
消息的结构:
{
"content":"Hello world!",
"extra":""
}名称
说明