用户工具

im_sdk详解

IM SDK详解

本文档将详细介绍云之讯IMSDK和TCPSDK的知识,包括架构、消息体系、消息收发流程等,您可以在阅读本文档后对云之讯IM有更深的了解,方便您更快的开发自己的产品。

  • IMSDK
  • IMSDk封装了会话、消息等各种IM业务对象,处理IM业务逻辑,对外提供IM业务能力接口。开发者调用SDK接口,快速集成IM业务能力。主要特点是接口清晰,利于理解。
  • TCPSDK
  • TCPSDK为IMSDK提供了基本的通信能力,封装登陆云平台、异常重连等功能,并对外提供通信能力接口。IMSDK需要依赖于TCPSDK。

一、IMSDK核心类

UCSIMClient是IMSDK的核心类。IMSDK提供的所有能力,都需要通过UCSIMClient的实例去调用。

二、会话实体类

UCSConversation 是会话实体类,首先您需要充分的了解 UCSConversation(会话) 和 UCSMessage(消息) 两个实体类的关系。
会话实体类是用来存储本地会话的容器类,消息实体类是用来存储本地消息的容器类。会话有多种类型,可以是单聊会话,也可以是群组会话等,每一个 UCSConversation(会话)包含多条 UCSMessage(消息),关系如下图所示:

通过 conversationType 和 targetId,您可以标识当前账号唯一的一个会话。ConversationType 枚举值意义和对应的 targetId 意义为:

会话类型枚举值 类型说明 targetId说明
UCS_IM_SOLOCHAT 单聊,用户间一对一聊天 对方的userId
UCS_IM_GROUPCHAT 群聊 群Id
UCS_IM_DISCUSSIONCHAT 讨论组聊天 讨论组Id
UCS_IM_SYSTEMMSG 系统会话 系统账户的Id
UCS_IM_Broadcast 广播会话 广播账户的Id
  • 通过一个 conversationType 和 targetId 组合,您可以确定一个唯一的会话。如当您需要发起单聊会话时,您需要传入 UCS_IM_SOLOCHAT 和 userId,当您需要发起群组聊天时,您需要传入 UCS_IM_GROUPCHAT 和 groupId,当您需要发起讨论组会话时,您需要传入 UCS_IM_DISCUSSIONCHAT 和 discussionId。

三、消息实体类

UCSMessage是一个消息实体类,包含了描述一条消息的所有属性。

  • 消息对应的会话类型(conversationType)。单聊会话、讨论组会话、群会话等。
  • 消息的内容类型(messageType)。文本、语音、图片、地图等
  • 消息接收者(receiveId)。如果这条消息是群组消息,receiveId是群id;如果这条消息是单聊消息,receveId是消息接收者的id;如果这条消息是讨论组消息,receveId是讨论组Id
  • 消息的唯一标识(messageId)。这个标识在每个账号上是唯一的。
  • 消息的方向(messageDirection)。这个属性可以用来判断消息是不是自己发出的。
  • 消息的发送者(senderUserId)。这条消息是谁发的
  • 发送者的昵称(senderNickName)。这个有可能为空,取决于客户端的APP Server有没有给云之讯平台传对应的昵称。
  • 消息发送状态(sentStatus)。这条消息的发送状态
  • 消息接收状态(receivedStatus)。这条消息在本地的接收状态。
  • 消息内容(content)。这个字段包含一个UCSMsgContent的子类的对象。如果这个会话对应的消息类型是文本,那么这个字段存储的就是一个UCSTextMsg类型的对象;如果是图片,就是一个UCSImageMsg类型的对象;如果是语音,就是一个UCSVoiceMsg类型的对象。开发者可以解析这个对象,然后自定义展示在UI上。
  • objectName、extra。这两个是保留字段,暂时未使用。

UCSMessage所有的属性,开发者只需要进行读取就可以,不要进行赋值。

四、消息内容类

1、UCSMsgContent 消息内容基类

UCSMsgContent是一个消息内容的基类,作为UCSTextMsg、UCSImageMsg等消息内容类的父类。

pushContent   云之讯服务器下发的内容,比如收到一条文本消息,这个pushContent的内容为"您有一条新的文本消息"。
rawData     保留字段,未使用

消息内容类不同于消息实体类(UCSMessage),消息内容类代表一条具体的消息内容,而消息实体类是消息类的外层容器,消息实体对象是消息对象在本地存储的外层对象,消息实体对象除了包含消息对象外,还包括消息的方向、接收状态、接收时间、发送者等。
当前版本的消息分两种,普通的内容类消息,和通知类消息,接下来将分别仔细介绍。

消息内容分类 对应的内容类
内容类 表示一个用户间发送的包含具体内容的消息,需要展现在聊天界面上,如文字消息(UCSTextMsg)、语音消息(UCSVoiceMsg)等。
通知类 表示一个通知信息,可能展现在聊天界面上,如讨论组通知(UCSDiscussionNotification)。

2、UCSTextMsg 文本内容类

UCSTextMsg。用来发送文字类消息,其中可以表情。继承自UCSMsgContent,是一个文本内容类。

content是消息文字内容,您可以传入字节数不大于1500的任意文本。
extra暂时未被使用,您可以直接忽略。
为了使用方便,建议您直接使用类方法initWithContent:构建整个对象。

演示代码如下:

    //给id为@"123456789"的用户发送一条文本消息
    UCSTextMsg *textMessage = [UCSTextMsg initWithContent:@"文本消息内容,字节长度请不要超过1500"];
    [[UCSIMClient sharedIM] sendMessage:UCS_IM_SOLOCHAT receiveId:@"123456789" msgType:UCS_IM_TEXT content:textMessage success:^(long long messageId) {
        NSLog(@"文本消息发送成功");
    } failure:^(UCSError *error, long long messageId) {
        NSLog(@"文本消息发送失败,失败原因error:%@", error);
    }];

3、UCSVoiceMsg 语音内容类

UCSVoiceMsg。语音内容类,继承自UCSMsgContent。发送语音时,填充 amrAudioData、duration这两个字段,voicePath不需要填充。接收语音时 或者 获取聊天记录时,voicePath、duration这两个字段有值,amrAudioData为空。

amrAudioData   AMR格式的data。(发送语音的时,必填)
voicePath  语音的本地路径。(接收语音时,这个参数存放语音在本地的地址)
duration   语音时长。(发送语音时,必填)
extra      保留字段,暂时未被使用
为了使用方便,建议您直接使用initWithAmrAudioData:duration:构建整个对象。

演示代码如下:

    //给id为@"28565844"的讨论组发送一条长度为10s的语音消息
    UCSVoiceMsg *voiceMessage = [UCSVoiceMsg initWithAmrAudioData:voiceData duration:10.0];
    [[UCSIMClient sharedIM] sendMessage:UCS_IM_DISCUSSIONCHAT receiveId:@"28565844" msgType:UCS_IM_VOICE content:voiceMessage success:^(long long messageId) {
        NSLog(@"语音消息发送成功");
    } failure:^(UCSError *error, long long messageId) {
        NSLog(@"语音消息发送失败,失败原因error:%@", error);
    }];

4、UCSImageMsg 图片消息内容类

UCSImageMsg。图片内容类,继承自UCSMsgContent。

thumbnailLocalPath  缩略图本地路径。
imageRemoteUrl  大图的远程url。自己发送的图片消息,这个字段为空。
imageLocalPath  大图的本地路径。收到的图片消息,这个字段为空。
originalImage  原图。(发送图片时,只需要给这个参数赋值就行,其他的参数不需要赋值)。发送时必填。
                当收到别人的图片消息时,这个字段为空。获取图片可以通过imageRemoteUrl这个参数自定义下载。
                当取出聊天的历史消息时,无论消息是发送的还是接收的,这个参数都为空。
                自己发送的图片可以通过imageLocalPath这个参数去获取,接收的图片可以imageRemoteUrl这个参数去获取。
extra  保留字段,暂时未被使用
为了使用方便,建议您直接使用initWithOriginalImage:构建整个对象

演示代码如下:

    //给id为@"abc"的群发送一张图片
    UIImage *image = [UIImage imageNamed:@"test.jpg"];
    UCSImageMsg * imageMessage = [UCSImageMsg initWithOriginalImage:image];
    [[UCSIMClient sharedIM] sendMessage:UCS_IM_GROUPCHAT receiveId:@"abc" msgType:UCS_IM_IMAGE content:imageMessage success:^(long long messageId) {
        NSLog(@"图片发送成功");
    } failure:^(UCSError *error, long long messageId) {
        NSLog(@"图片发送失败,失败原因error:%@", error);
    }];

5、UCSLocationMsg 地理位置内容类

UCSLocationMsg。地理位置内容类,继承自UCSMsgContent。

latitude  纬度
longitude 经度
coord_type  坐标类型。如果开发者不使用可以置空。
address  地址信息
thumbnailImage  位置缩略图
为了使用方便,建议您直接使用initWithLatitude:longitude:address:locationImage:coord_type:构建整个对象

演示代码如下:

    //给id为@"abc"的群发送一个地理位置信息
    UIImage *locationImage = [UIImage imageNamed:@"位置缩略图.jpg"];
    UCSLocationMsg *locationMessage = [UCSLocationMsg initWithLatitude:30.00 longitude:30.00 address:@"我的位置" locationImage:locationImage coord_type:nil]
    [[UCSIMClient sharedIM] sendMessage:UCS_IM_GROUPCHAT receiveId:@"abc" msgType:UCS_IM_Location content:locationMessage success:^(long long messageId) {
        NSLog(@"位置发送成功");
    } failure:^(UCSError *error, long long messageId) {
        NSLog(@"位置发送失败,失败原因error:%@", error);
    }];

6、UCSCustomMsg 自定义内容类

UCSCustomMsg。自定义内容类。当您发送自定义消息时,需要将需要发送的内容转成NSData类型的字节流,接收者收到的同样是NSData类型的字节流,整个加密解密的过程由开发者自己处理,SDK仅仅作为一个传输的通道。

data   传输的字节流。大小请不要超过64K。
为了使用方便,建议您直接使用initWithData:构建整个对象
    //给id为@"123456789"的讨论组发送一条自定义消息。
    // base64加密这段文字,GTMBase64是一个开源加密库,开发者可以选择任意加密方式。
    NSString *text = @"开发者可以根据自己的需求,将图片、语音、文本等数据加密成NSData类型的数据,构建自定义消息。云之讯SDK只负责传输这条消息,加密、解密的过程完全由开发者完成。"
    NSString * base64Str = [GTMBase64 encodeBase64String:text];
    NSData * data = [base64Str dataUsingEncoding:NSUTF8StringEncoding];
 
    //构建自定义消息
    UCSCustomMsg * customMsg = [[UCSCustomMsg alloc] initWithData:data];
    [[UCSIMClient sharedIM] sendMessage:UCS_IM_DISCUSSIONCHAT receiveId:@"123456789" msgType:UCS_IM_Custom content:customMsg success:^(long long messageId) {
        NSLog(@"发送成功");
    } failure:^(UCSError *error, long long messageId) {
        NSLog(@"发送失败,失败原因error:%@", error);
    }]

7、UCSDiscussionNotification 讨论组通知内容类

UCSDiscussionNotification是讨论组通知内容类。讨论组通知由服务器下发,您不需要去发送通知。

operatorId 讨论组的id
extension  扩展字段,用于存储服务器下发扩展信息。比如“张三 移除了 李四”。

页面工具