聊天云通讯

iOS SDK 2.0 体系架构
本文档将详细介绍融云的 SDK 产品架构和消息体系,以便于您更深入的了解融云并更快速的开发自己的产品。

image
融云 SDK 系统架构
IMKit

IMKit 的功能主要是封装各种界面对象,服务于开发者快速实现自己的产品,主要特点是是支持快速集成,支持丰富的界面定制功能。

IMLib

IMLib 的功能是提供基本通信能力库,封装了通信能力和 Conversation,Message 等各种对象,服务于需要根据自己的产品去自己实现界面的开发者。主要特点是封装清晰,轻量,便于使用。

Protocol

Protocol 是融云的核心协议栈,使用融云自定义的私有二进制协议。主要特点是是轻量化,有序可靠,不丢消息。Protocol 部分使用 Native 语言开发,在 Android 和 iOS 平台上保证业务一致性,便于开发者商用化自己的产品。

IMLib 体系架构
首先介绍 IMLib 的体系,对于真正使用融云 SDK 的用户,不管您选择 IMLib 还是 IMKit,您都需要了解一下体系概念。

image
融云 IMLib 体系架构
IMLib 的命名规则,在 iOS 上是 RCIMClient,在 Android 上是 RongIMClient。这是为了符合两个平台的命名习惯。
核心类
RCIMClinet 是 IMLib 的核心类,您可以直接使用它的方法,如 init,connect,setdevicetoken,sendMessage, sendImageMessage 等。您需要详细的了解所有接口的用法,请参考 API 文档。

会话实体类
RCConversation 是会话实体类,首先您需要充分的了解 Conversation(会话) 和 Message(消息) 两个实体类的关系。

会话实体类和消息实体类是用来存储本地会话和消息的容器类,除了包含会话内容和消息内容外,还包括了保存在本地的各种状态,您在客户端读取消息时,获取的对象都和这两个类相关。会话有多种类型,可以是私聊会话,也可以是群组会话等,每一个 Conversation(会话)包含多条 Message(消息),关系如下图所示:

image

通过 conversationType 和 targetId,可以唯一确定一个会话。ConversationType 枚举值意义和对应的 targetId 意义为:

会话类型枚举 ConversationType 说明 对应的 targetId
PRIVATE 单聊 用户的 Id(userId)。
GROUP 群组 群组的 Id(groupId)。
DISCUSSION 讨论组 讨论组的 Id(discussionId)。
CHATROOM 聊天室 聊天室的 Id(chatroomId)。
CUSTOMER_SERVICE 客服 客服的 Id(customerServiceId)。
SYSTEM 系统会话 系统账户 Id。可以理解为 QQ 的 10000 号的角色。
APP_PUBLIC_SERVICE 应用公众服务 应用公众服务的 Id(publicServiceId)。
PUBLIC_SERVICE 公众服务 公众服务的 Id(publicServiceId)。
请注意区分会话类型和消息类型,会话类型是针对会话的分类,不同的会话类型决定了不同的会话逻辑。
另:系统会话类型并不一定代表是“系统消息”,本质上与单聊会话类型没有区别,只是逻辑上做了不同的区分,便于展开不同的产品业务逻辑。
通过一个 conversationType 和 targetId 组合,您可以确定一个唯一的会话。如当您需要发起单聊会话时,您需要传入 ConversationType_PRIVATE 和 userId,当您需要发起群组聊天时,您需要传入 ConversationType_GROUP 和 groupId,当您需要发起讨论组会话时,您需要传入 ConversationType_DISCUSSION 和 discussionId。

消息实体类
RCMessage 是消息实体类,消息实体类是消息类的外层容器,消息实体对象是消息对象在本地存储的外层对象,消息实体对象封装了消息的基本信息如类型、 ID、消息的方向、接收状态、接收时间、发送者等。您可能需要先了解其中两个成员参数的概念。

objectName

代表消息内容的类型,是一个标示符(Identifier),融云内置消息类型以 RC: 开头,如 RC:TxtMsg,RC:ImgMsg,RC:VcMsg 等。

content

消息类,一个 RCMessageContent 类型的对象,代表着实际的消息。

消息类
MessageContent 是消息类,他也是所有消息的基类,文本、图片等消息都继承于它,如您要自定义消息,也要继承它实现。

消息类不同于消息实体类(RCMessage),消息类代表一条具体的消息内容,消息实体类是消息类的外层容器,消息实体对象是消息对象在本地存储的外层对象,消息实体对象除了包含消息对象外,还包括消息的方向、接收状态、接收时间、发送者等。

每一条消息内容都一个标示符(Identifier),用来标识自己的类型,该标示符必须唯一。消息内容类的重要函数是 encode ,每一个消息都需要实现自己的 encode 方法来封装消息内容。

当前版本的消息分两种,普通的内容类消息,和通知类消息,接下来将分别仔细介绍。

消息分类 消息行为状态标识
内容类消息 表示一个用户间发送的包含具体内容的消息,需要展现在聊天界面上,如文字消息、语音消息等。
通知类消息 表示一个通知信息,可能展现在聊天界面上,如提示条通知。
文字消息类
RCTextMessage。用来发送文字类消息,其中可以包括超链接,会自动识别。继承自RCMessageContent,是一个普通内容类消息。

消息类名:RCTextMessage

消息 ObjectName:RC:TxtMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构:{"content":"Hello world!","extra":""}

其中 content 为文字消息的文字内容,extra 可以放置任意的数据内容,也可以去掉此属性。

语音消息类
RCVoiceMessage。用来发送语音片段消息,其中可以包括超链接,会自动识别。

消息类名:RCVoiceMessage

消息 ObjectName:RC:VcMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构:{"content":"bhZPzJXimRwrtvc=","duration":7,"extra":""}

其中 content 为语音消息录制转码成 AMR 格式后,进行 Base64 编码的结果值,duration 为语音消息的时长(单位:秒),extra 可以放置任意的数据内容,也可以去掉此属性。

图片消息类
RCImageMessage。用来发送图片类消息。

消息类名:RCImageMessage

消息 ObjectName:RC:ImgMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构:{"content":"bhZPzJXimRwrtvc=","imageUri":"http://p1.cdn.com/fds78ruhi.jpg","extra":""}

图片消息包括两个主要部分:缩略图和大图,缩略图直接 Base64 编码后放入 content 中,大图首先上传到文件服务器(融云 SDK 中默认上传到七牛云存储),然后将云存储上的大图地址放入消息体中。流程示意如下:

其中 content 为图片内容进行 Base64 编码的结果值,imageUri 为图片上传到图片存储服务器后的地址,extra 可以放置任意的数据内容,也可以去掉此属性。

缩略图尺寸为:240 x 240 像素,以宽度和高度中较长的边不超过 240 像素等比压缩。

大图尺寸为:960 x 960 像素,以宽度和高度中较长的边不超过 960 像素等比压缩。

图文消息类
RCRichContentMessage。用来发送图文消息,包含一个标题,一段文字内容和一张图片。

消息类名:RCRichContentMessage

消息 ObjectName:RC:ImgTextMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构: {"title":"Big News","content":"I‘m Ironman.","imageUri":"http://p1.cdn.com/fds78ruhi.jpg","url":"http://www.rongcloud.cn","extra":""}

其中 title 为消息的标题,content 为消息的文字内容,imageUri 为图片的地址,url 为跳转的地址,extra 可以放置任意的数据内容,也可以去掉此属性。

图片尺寸为:120 x 120 像素。

地理位置消息类
RCLocationMessage。用来发送地理位置消息。

消息类名:RCLocationMessage

消息 ObjectName:RC:LBSMsg

消息状态行为标识:MessageTag.ISPERSISTED | MessageTag.ISCOUNTED

消息的结构:{"content":"bhZPzJXimRwrtvc=","latitude":39.9139,"longitude":116.3917,"poi":"北京市朝阳区北苑路北辰泰岳大厦","extra":""}

其中 content 为地图缩略图内容进行 Base64 编码的结果值,latitude 为位置的纬度值,longitude 为位置的经度值,poi 为位置兴趣点名称,extra 可以放置任意的数据内容,也可以去掉此属性。

提示条(小灰条)通知消息
RCInformationNotificationMessage。用来发送在聊天会话页面显示的提示条(小灰条)通知。

消息类名:RCInformationNotificationMessage

消息 ObjectName:RC:InfoNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"message":"请在聊天中注意人身财产安全",extra:""}

其中 message 为提示条消息内容,extra 可以放置任意的数据内容,也可以去掉此属性。

联系人(好友)通知消息
RCContactNotificationMessage。用来发送联系人操作(加好友等)的通知消息。

消息类名:RCContactNotificationMessage

消息 ObjectName:RC:ContactNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"operation":"Request","sourceUserId":"123","targetUserId":"456","message":"我是小艾,能加一下好友吗?","extra":""}

其中 operation 为联系人操作的指令,sourceUserId 为发出通知的用户 Id,targetUserId 为接收通知的用户 Id,message 为通知附带的消息内容,extra 可以放置任意的数据内容,也可以去掉此属性。

官方针对 operation 属性定义了 "Request", "AcceptResponse", "RejectResponse" 几个常量,也可以由开发者自行扩展。

资料通知消息
RCProfileNotificationMessage。用来发送用户资料变更通知消息。

消息类名:RCProfileNotificationMessage

消息 ObjectName:RC:ProfileNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"operation":"Update","data":"{\"nickname\":\"韩梅梅\", \"hometown\":\"beijing\"}","extra":""}

其中 operation 为资料通知操作,可以自行定义,data 为操作的数据,extra 可以放置任意的数据内容,也可以去掉此属性。

通用命令通知消息
RCCommandNotificationMessage。用来发送通用的指令通知消息,消息内可以定义任意 JSON 内容。

消息类名:RCCommandNotificationMessage

消息 ObjectName:RC:CmdNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"name":"AtPerson","data":"{\"sourceId\":\"9527\"}"}

其中 name 为命令名称,可以自行定义,data 为命令的内容。

群组通知消息
用来发送群组操作的通知消息。

消息类名:RCGroupNotificationMessage

消息 ObjectName:RC:GrpNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"operatorUserId":"4324","operation":"Rename","data":"本地生活","message":"修改本群名为本地生活","extra":""}

其中 operatorUserId 为操作人用户 Id,operation 为操作名,data 为操作数据如:目标用户 Id 或修改后群名称,message 为消息内容,extra 可以放置任意的数据内容,也可以去掉此属性。

讨论组通知消息
用来发送讨论组操作的通知消息。

消息类名:RCDiscussionNotificationMessage

消息 ObjectName:RC:DizNtf

消息状态行为标识:MessageTag.ISPERSISTED

消息的结构:{"type":1,"extension":"3213,4332","operator":"5435"}

其中 type 为讨论组操作类型 1:加入讨论组 2:退出讨论组 3:讨论组改名 4:讨论组管理员踢人,extension 为被加入讨论组用户 Id,多个用户 Id 以逗号分割,operator 为当前操作用户 Id。

命令消息
RCCommandMessage。用来发送通用的指令通知消息,消息内可以定义任意 JSON 内容,与通用命令通知消息的区别是不存储、不计数。

消息类名:RCCommandMessage

消息 ObjectName:RC:CmdMsg

消息的结构:{"name":"AtPerson","data":"{\"sourceId\":\"9527\"}"}

其中 name 为命令名称,可以自行定义,data 为命令的内容。

自定义消息
融云内置了五种消息内容和四种通知类消息。这可以满足大部分需求,但针对您的 App 的特殊需求,您可能需要增加自己独特的内容类型,这就是自定义消息。

要想自行定义消息,首先要了解 ObjectName 和 MessageTag 两个概念:

ObjectName 属性

ObjectName 是消息的全局标识,用来在各种场景下判断和区分不同的消息类型。

融云系统内置消息的命名规范为:RC:XxxMsg(内容类消息)或 RC:XxxNtf(通知类消息)或 RC:XxxSts(状态类消息),您在自定义消息时需要注意,不要以 "RC:" 开头,以避免与融云系统内置消息的 ObjectName 重名。
MessageTag 注解类型

MessageTag 定义约定了消息在客户端的行为和表现。MessageTag 的第一个参数为该消息的 ObjectName,第二个参数定义消息行为状态标识,可以对传值进行或运算:

枚举值 说明
MessageTag.NONE 为空值,不表示任何意义。
MessageTag.ISCOUNTED 表示客户端收到消息后,要进行未读消息计数(未读消息数增加 1),所有内容型消息都应该设置此值。非内容类消息暂不支持消息计数。
MessageTag.ISPERSISTED 表示客户端收到消息后,要进行存储,并在之后可以通过接口查询。
消息类型 消息基类 消息行为状态标识
内容类消息 MessageContent MessageTag.ISPERSISTED | MessageTag.ISCOUNTED
通知类消息 NotificationMessage MessageTag.ISPERSISTED
状态类消息 StatusMessage MessageTag.NONE
要实现自定义消息,您需要实现一个 CustomMessageContent 继承 RCMessageContent,在您的自定义消息内容类里实现您的自定义数据。基类 RCMessageContent 声明符合 RCMessageCoding 协议和 RCMessagePersistentCompatible 协议,所以您必须实现以下函数:

@protocol RCMessageCoding <NSObject>
@required
/**
    编码将当前对象转成JSON数据
    @return 编码后的JSON数据
 */
- (NSData *)encode;
/**
    根据给定的JSON数据设置当前实例
    @param data 传入的JSON数据
 */
- (void)decodeWithData:(NSData *)data;

/**
    应返回消息名称,此字段需个平台保持一致
    @return 消息体名称
 */
+ (NSString *)getObjectName;

@end

/**
    @protocol RCMessagePersistentCompatible
    @discussion   RCMessageContent 已经实现此协议方法,派生类需按照自己需求重新覆盖实现,
 */
@protocol RCMessagePersistentCompatible <NSObject>
@required
/**
    返回遵循此protocol的类对象持久化的标识

@return 返回持久化设定标识
    @discussion   默认实现返回 @const (MessagePersistent_ISPERSISTED | MessagePersistent_ISCOUNTED)
*/
+(RCMessagePersistent)persistentFlag;
@end
这里给出文字消息的定义举例,文字消息也是继承于RCMessageContent。

#import "RCTextMessage.h"
#import "RCUtilities.h"
#import "RCJSONConverter.h"
#import "RCCommonDefine.h"

@implementation RCTextMessage

+(instancetype)messageWithContent:(NSString *)content {
    RCTextMessage *text = [[RCTextMessage alloc] init];
    if (text) {
        text.content = content;
    }
    return text;
}

+(RCMessagePersistent)persistentFlag {
    return (MessagePersistent_ISPERSISTED | MessagePersistent_ISCOUNTED);
}

#pragma mark - RCMessageCoding delegate methods

-(NSData *)encode {

NSMutableDictionary *dataDict=[NSMutableDictionary dictionary];
    [dataDict setObject:self.content forKey:@"content"];
    if (self.extra) {
        [dataDict setObject:self.extra forKey:@"extra"];
    }
    //NSDictionary* dataDict = [NSDictionary dictionaryWithObjectsAndKeys:self.content, @"content", nil];
    NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict
                                                   options:kNilOptions
                                                     error:nil];
    return data;
}

-(void)decodeWithData:(NSData *)data {

if (!data) {
        return;
    }
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data
                                                         options:kNilOptions
                                                           error:&__error];

if (json) {
        self.content = json[@"content"];
        self.extra = json[@"extra"];
    }
}

+(NSString *)getObjectName {
    return RCTextMessageTypeIdentifier;
}

@end
注册自定义消息
自定义消息完成后,需要注册到系统消息类型中,系统就会把您的自定义消息与其他消息同等处理。注册时机是在调用 init 之后,connect 之前。以下是系统消息注册的代码,请参考。

[self registerMessageType:RCTextMessage.class];
    [self registerMessageType:RCImageMessage.class];
    [self registerMessageType:RCVoiceMessage.class];
以上,您已经完成了自定义消息的定义,发送端接收端是可以收到这条自定义消息的,然后,你将关心自定义消息的展现,请您阅读下一节的"消息展现自定义"。

IMKit 体系架构
IMKit界面组件是融云产品的核心特色,开发者使用 IMKit,不需要从头开发自己的界面,只需要通过简短的代码即可集成到您的 App 产品中。会话列表、聊天窗口、消息内容选择、表情库、好友选择、会话设置这些最复杂的功能,融云IMKit已经替您完成。参考快速入门,您在启动聊天会话列表之后,所有的界面融云已经替您完成。

对于进一步有丰富自定义需求的用户,融云IMkit支持会话列表、聊天窗口、输入框、消息内容的自定义,你可以通过继承和重写界面的方法完成自己独特的界面。

image
融云 iOS IMKit 体系架构
IMKit主要有两个界面,会话列表( Conversation List )和会话( Conversation ),在融云IMKit的实现中,前者是一个 UITableView,后者是一个 UICollectionView。

在会话界面中,其中的每一条消息是一个 UICollectionViewCell,支持自动布局。目前融云替开发者实现了五种普通内容的消息的界面展现:文本,图像,语音,图文,位置,相关接口也全部开放,您可以使用也可以继承 RCMessageCell 自定义自己的消息展现。

RCConversationModel 是会话模型,包含了每一条具体会话的数据;RCMessageModel 是消息模型,包含了每一条具体消息的数据,开放给 App 根据自己的需求访问和使用。

RCConversationListViewController 和 RCConversationViewController 都继承于 RCBaseViewController,您可以继承他们并实现自己的自定义会话列表

时间: 2024-10-11 09:57:04

聊天云通讯的相关文章

融联云通讯的底层实现协议简介

本次主要给大家介绍一下融联云通讯的底层实现使用的一些协议和协议的简介: 融联云通讯就是我们常说的即时通讯,是一个非常不错的即时通讯SDK,使用简单,功能强大,效率高. 融联底层使用的是protocol buffer,传输层是TCP,媒体流是SIP,视频流是UDP 下面我来总结一下protocol buffer语言和TCP/SIP/UDP的三种协议的说明: protocol buffer: 1.概览 1.1 什么是protocol buffer protocol buffer是google的一个开

云通讯 添加群组

群组和双向回呼是一个级别的 应为他们都是属于子账户的操作 所以 他们的子帐号鉴权信息验证是一样 在sdk包里添加 /** 添加组 */ function CreateGroup($Group) { //子帐号鉴权信息验证,对必选参数进行判空. $auth=$this->subAuth(); if($auth!=""){ return $auth; } // 拼接请求包体 if($this->BodyType=="json"){ $body= "

C#批量发送手机短信——云通讯平台

云通讯平台:http://www.yuntongxun.com 1.在云通讯平台建短信模板 2.通过上述账号信息编辑如下: //phoneNumber 发送到的手机号 content 短信内容 public ResponseMessage SmsSend(string phoneNumber, string content) { CCPRestSDK api = new CCPRestSDK(); //ip格式如下,不带https:// bool isInit = api.init("app.c

接棒Twilio 中国版云通讯服务“独角兽”正在崛起

随着独角兽企业"Twilio"在美股上市,其所在的云通讯服务行业再次成为投资者.行业关注的热点,而其上市一周就股价翻番的现象也再次证明了全球市场对云通讯服务前景的肯定. 无独有偶,中国正在几乎同一时间见证一个中国版"Twilio"的崛起. 日前,专注于向企业提供基于互联网的云通讯服务商容联云通讯在北京召开发布会,正式宣布获得由红杉资本中国基金领投的7000万美金C轮融资.至此,容联云通讯发展仅3年有余,估值即高达数亿美元,这比Twilio发展8年才获得今天的成就,更

给Arduino打电话 — Twilio云通讯

怎样 用你的电话 呼叫Arduino,用Twilio和Yaler.net就可以做到! Twilio是一个网页服务器,可以把所有的消息都转移到电话中.这是一个用于电话通讯的REST API,托管于云服务器.基于这样的环境,当有人呼叫Arduino预先设好的电话号时,Twilio向Arduino请求一个新的voice.xml文件.响应内容读给呼叫人Alice,一端发向语音识别引擎的Twilio的文本的语音. Yaler.net 能使网页访问防火墙后的嵌入式设备,NAT或者一个移动网络路由.这就使Tw

开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本发布

经过恩布团队全体成员的不懈努力,按照原定计划,终于在今天(5月14日)发布第二个开源版本,恩布企业互联IM,ENTBOOST 0.2.0(r174beta)Windows版本:主要功能支持文本.表情,图片,文件共享,语音视频,云盘,群组,离线消息等功能:免费开放恩布 900在线客服系统,安卓手机客户端在线客服功能,开放客户端源码,支持PC SDK API,REST API.Android SDK等接口,支持对接企业内部各种业务系统: ENTBOOST是跨平台.跨应用的实时通讯开放平台,恩布网络致

容联云通讯API的学习过程及 RestAPI Node.js 封装

进入正文~ 公司最近有个活动,会用到云通讯的功能.作为一个全栈工程师自然是对 JavaScript 比较熟一点,所以决定选择 Nodejs 来进行开发.看了一下云通讯的文档,没有 Nodejs 的 SDK (´°????????ω°????????`) 好在 Rest API 是基于 HTTP 协议的,用其他语言也能很容易地实现接口 (?>?<?) 可能是因为对云通讯这种功能没什么概念吧,看了一遍文档还是云里雾里的.怎么办呢……于是决定对着文档一个一个接口试,试下来以后对云通讯的功能也有了个大

【转+修改】容联云通讯api调用短信发送调用

转自   https://my.oschina.net/u/1995134/blog/814540 需要荣联云通讯 的 相对应SDKjar包. CCP_REST_SMS_SDK_JAVA_v2.6.3r.jar 调用测试在main方法里: public static void main(String[] args){ ResponseObj obj = FhPhoneMassageSender.testSender("176****5720","呵呵"); -- 手

引领手机流量营销 容联云通讯嘿嘿流量打造多场景专业服务

随着4G网络和智能设备的快速普及,手机流量作为移动互联网时代的用户刚需,已经被越来越多的企业采购作为宣传推广产品的敲门砖.手机流量营销,其实是一种全新的激励营销方式,电商.APP.游戏等产品在做营销推广时,以手机流量包作为激励品,刺激用户参与活动和互动,以达到营销推广的目的. 当然,这些流量活动都离不开第三方手机流量分发平台,一个连接着运营商和互联网厂商的关键点.今日,我们就拿嘿嘿流量为例,简单分析下第三方手机流量分发平台的使用场景. 嘿嘿流量:多场景手机流量营销方案 嘿嘿流量为企业提供灵活.便