目录

IM SDK集成

在您阅读此文档之前,我们假定您已经具备了基础的 iOS 应用开发经验,并且理解即时通讯的相关概念。

一、前期准备

1、注册开发者账号

开发者账号是开发者管理应用的主账号,您需要拥有一个开发者账号才能开始创建应用。如果您还未注册,或者希望使用新的账号创建应用,请前往云之讯账户系统注册开发者账号。

注册时,请您使用真实的手机号码和邮箱,以方便我们向您发送重要通知并在紧急时刻能够联系到您。

如果您想了解更多,请前往云之讯开发者账户指南

2、创建应用

完成开发者账号注册后,在为您的APP集成云之讯能力之前,您需要前往云之讯开发者控制台创建应用,这个应用和您需要集成云之讯能力的APP是一对一的对应关系。

您可以点击页面左上方创建应用按钮开始创建一个应用。在创建应用界面,您需要填写应用名称、应用类型、所属行业三个必选项。云之讯强烈建议您设置服务器白名单,设定白名单地址后,云之讯服务器在识别该应用请求时将只接收白名单内服务器发送的请求,能有效提升帐号安全性。 如未设置默认不生效。如果您的应用需要使用到高级配置中的能力,您需要勾选对应的能力项。

如果您想了解更多,请前往云之讯管理平台使用指南

3、下载、导入SDK

在单独集成云之讯IM通讯能力的情况下,您需要用到云之讯IMSDK云之讯TCPSDK两份SDK。如果您对云之讯TCPSDK仍有疑问,可以前往SDK详解了解。

1、下载SDK

您可以到云之讯官网下载SDK

2、SDK目录讲解

云之讯 IMSDK文件结构说明(以版本v3.0.4为例,后续版本可能有小的变动)
lib静态库

libucsimlib.a                整个IMSDK的库文件,消息业务逻辑处理的库

头文件

UCSIMSDK.h                   包含整个IMSDK的头文件,使用时请import这个文件			
UCSIMClient.h                包含IMSDK的核心能力接口,比如发消息、获取会话列表等。
UCSIMClientDelegate.h        包含IMSDK的回调接口,回调服务器返回到SDK的信息。比如接收到服务器返回的消息、接收到服务器返回的错误等。
UCSIMDefine.h                包含IMSDK的一些定义。比如聊天类型、会话类型、消息发送状态等。
UCSConversation.h            会话类型
UCSDiscussion.h              讨论组类型
UCSMessage.h                 消息类型,包含一条消息的所有属性
UCSUserInfo.h                用户信息类
UCSMsgContent.h              消息内容基类
UCSTextMsg.h                 文本消息类,UCSMsgContent的子类
UCSImageMsg.h		     图片消息类,UCSMsgContent的子类
UCSVoiceMsg.h                语音消息类,UCSMsgContent的子类
UCSLocationMsg.h             地理位置消息类,UCSMsgContent的子类
UCSDiscussionNotification.h  讨论组通知类,UCSMsgContent的子类
UCSNotificationMessage.h     通知消息类,UCSMsgContent的子类
UCSCustomMsg.h               自定义消息类,UCSMsgContent的子类
UCSUnknownMsg.h              未知消息类。(高版本的SDK可能会增加新的消息类型,低版本使用未知消息类型兼容识别不了的新类型)

云之讯 TCPSDK文件说明(以版本V3.0.4为例,后续版本可能有小的变动)
lib静态库

libucstcplib.a          整个TCPSDK的库文件,与云平台进行通讯的库

头文件

UCSTCPSDK.h             包含TCPSDK所有头文件,使用时请import这个文件
UCSTcpClient.h          包含TCPSDK的核心能力接口,比如登陆云平台、注销云平台等。
UCSTcpClientDelegate.h  包含TCPSDK的事件回调接口
UCSTcpDefine.h          TCP相关的一些定义
UCSError.h              SDK错误信息定义类

3、IMSDK、TCPSDK的关联

如果您是第一次接入云之讯服务,可能会对TCPSDK感到陌生。云之讯平台提供IM通讯Voip通讯等能力,这些能力都要和云之讯服务器进行交互,包括登陆、重连、断开等。我们将这部分共有的能力抽取出来,封装成TCPSDK
TCPSDK专注于和服务器之间的连接交互,IMSDK专注于IM业务的逻辑处理,VoipSDK专注于Voip业务的逻辑处理。这些能力SDK之间可以自由组合。如果您需要同时集成IM和Voip能力,那么您需要组合TCPSDK + IMSDK + VoipSDK。如果您仅仅需要集成IM能力,那么您仅需要组合TCPSDK + IMSDK

4、导入SDK

将下载好的IMSDK和TCPSDK文件夹拖入到项目中,并勾选Destination。

5、添加系统依赖库

向Build Phases → Link Binary With Libraries 中添加以下依赖库

SDK的依赖库有:

libstdc++.dylib
libc++.dylib
libz.1.1.3.dylib
SystemConfiguration.framework
libsqlite3.0.dylib
libicucore.dylib

如果您使用的是 Xcode7.* 版本,则需要将上面的动态库*.dylib 的后缀改为*.tdb

6、设置ObjC属性

向Targets →Build Settings → Linking → Other Linker Flags 中 添加-ObjC(注意大小写)

7、设置 App 支持 HTTP

iOS 9 中,Apple 引入了新特性 App Transport Security (ATS),默认要求 App 必须使用 HTTPS 协议。

云之讯IMSDK内部需要使用到 HTTP,所以您需要设置在 App 中使用允许使用 HTTP。
在 App 的 Info.plist 中添加NSAppTransportSecurity类型Dictionary。
在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads类型Boolean,值设为 YES。

二、IMSDK 快速集成

1、获取TOKEN

云之讯TOKEN分为两类:
第一类是开发者主账号ID(ACCOUNT SID)对应的AUTH TOKEN,相当于开发者账号的密码,在SDK登录、REST请求中使用,您可以在开发者控制台查看这个TOKEN。初始的开发者TOKEN在网站注册后,系统自动生成;如果出现开发者TOKEN泄露的情况,系统支持开发者TOKEN重置。
第二类是开发者创建的应用下的用户TOKEN,相当于您APP上当前用户连接云之讯平台的身份凭证。您可以通过REST API为您APP上的每一位用户创建一个对应的子账号,您的APP账户体系和云之讯账户体系一一对应。获取到这个TOKEN之后,您APP上的用户就可以使用这个TOKEN去连接云之讯服务器。您可以前往Rest API介绍了解更多。

2、工程准备

您在尝试集成 SDK 的时候,为了方便,可以新建一个工程。并参考前面章节中的步骤,在工程中导入了SDK并设置了各种库依赖。

3、初始化SDK

云之讯建议您为您的APP添加一个预编译文件,在这个预编译文件中引入UCSIMSDK头文件和UCSTCPSDK头文件

#import "UCSIMSDK.h"
#import "UCSTCPSDK.h"

1、连接服务器

将您获取到的Token,通过UCSTcpClient的单例,传入到-login_connect:success:failure:方法,即可建立和云之讯服务器的连接。
在 App 整个生命周期,您只需要调用一次此方法与云之讯服务器建立连接。之后无论是网络出现异常或者 App 有前后台的切换等,TCPSDK都会负责自动重连。TCPSDK针对iOS的前后台和各种网络状况,进行了连接和重连机制的优化,建议您调用一次-login_connect:success:failure:方法即可,其余交给TCPSDK处理。 除非您已经手动将连接断开,或者其他地方登陆将您强行T下线,否则您不需要自己再手动重连。连接服务器时,在登陆结果未返回之前,请不要主动断开连接或者再次登陆。

[[UCSTcpClient sharedTcpClientManager] login_connect:@"您的登陆TOKEN" success:^(NSString *userId) {
    NSLog(@"登陆成功。当前登录的用户ID:%@", userId);
} failure:^(UCSError *error) {
    //TOKEN不正确。
    //网络故障
    NSLog(@"登陆失败, 错误码%d, 错误说明:%@", error.code, error.description);
}];

2、设置TCPSDK 和 连接状态监听

您可以实时地监控和云之讯服务器之间的连接状态,实时地根据连接状态调整UI显示,优化用户体验。TCPSDK的UCSTCPDelegateBase协议声明了一些回调方法。您可以遵守UCSTCPDelegateBase协议,设置TCPSDK的代理对象,并且实现-didConnectionStatusChanged:error:方法来监控连接状态。

/**
 * 设置TCPSDK代理对象
 */
[[UCSTcpClient sharedTcpClientManager] setTcpDelegate:self];
 
/**
 *  实现协议方法,监听连接状态变化
 *  @param connectionStatus 当前连接状态
 *  @param error            连接异常的错误类
 */
- (void)didConnectionStatusChanged:(UCSConnectionStatus)connectionStatus error:(UCSError *)error{
    switch (connectionStatus) {
        case UCSConnectionStatus_BeClicked:
            NSLog(@"当前账号在其他地方登陆,您被强行T下线");
            break;
        case UCSConnectionStatus_ReConnectFail:
            NSLog(@"重连失败");
            break;
        case UCSConnectionStatus_StartReConnect:
            NSLog(@"开始重连");
            break;
        case UCSConnectionStatus_ReConnectSuccess:
            NSLog(@"重连成功");
            break;
        case UCSConnectionStatus_loginSuccess:
            NSLog(@"登陆成功");
            break;
        case UCSConnectionStatus_ConnectFail:
            NSLog(@"登陆失败");
            break;
        default:
            break;
    }
}

3、设置IMSDK代理

当收到新消息、讨论组发生变化时,IMSDK会通过UCSIMClientDelegate协议通知上层。您需要遵守UCSIMClientDelegate协议,设置IMSDK的代理对象,实现协议方法才能够监听这些事件。

/**
 *设置IMSDK的代理对象
 */
[[UCSIMClient sharedIM] setDelegate:self];
 
/**
 *  收到了消息
 *  @param messageArray 消息数组
 */
- (void)didReceiveMessages:(NSArray *)messageArray{
    NSLog(@"收到了消息");
}
 
/**
 *  被T出某个讨论组时回调
 *  @param discussionID 讨论组id
 */
- (void)didRemoveFromDiscussionWithDiscussionId:(NSString *)discussionID{
    NSLog(@"你被踢出了讨论组 , 讨论组id为: %@", discussionID);
}

4、断开连接

当您需要与云之讯服务器断开连接时,您可以通过UCSTcpClient的单例,调用login_uninitWithFlag:方法。在断开与云之讯服务器的连接时,您可以设置是否仍接收远程推送。
如果设置了接收推送,断开连接之后,如果有人给该用户 ID 发送消息,云之讯的服务器会根据 DeviceToken推送证书将消息发送到苹果推送服务器,苹果服务器会将该消息以远程推送的形式下发到客户端。

/**
 *  @brief  断开客户端和云平台的连接,并且根据flag标识的bool值选择是否关闭离线推送。
 *  @param flag 是否关闭推送的bool值。YES,关闭。NO,不关闭。
 *  @discussion 断开连接。
 */
- (void)login_uninitWithFlag:(BOOL)flag;

三、会话

会话实体类UCSConversation,每一个UCSConversation对象代表本地存储的一条会话。UCSConversation包含以下属性:会话类型(conversationType)、会话ID(targetId)、会话名称(conversationTitle)、未读消息数(unreadMessageCount)、是否置顶(isTop)、草稿(draft)、最近一条消息相关(receivedStatus、sentStatus、time、senderUserId、senderUserName、lastestMessageType、lastestMessageId、lastestMessage)

1、查询本地存储的会话

/**
 *  @brief 获取会话列表
 *  @param conversationListType 会话列表的类型。具体参考UCS_IM_ConversationListType
 *  @return 会话数组,每个元素是一个UCSConversation对象
 */
- (NSArray *)getConversationList:(UCS_IM_ConversationListType)conversationListType;

2、删除本地存储的会话

/**
 *  @brief 清空会话列表
 *  @discussion 这个方法是用来清空会话列表,注意和clearMessages:targetId:这个方法区分开来。
 *  @return 操作结果的bool值
 */
- (BOOL)clearConversations;
 
/**
 *  @brief 在会话列表中移除一个会话,但是不会删除该会话在数据库中的消息。
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @return 操作结果的bool值
 */
- (BOOL)removeConversation:(UCS_IM_ConversationType)conversationType
                  targetId:(NSString *)targetId;

3、置顶会话

对一些关键会话,您可以选择性地将会话置顶或者取消置顶。

/**
 *  @brief 会话列表中,设置某条会话的置顶状态
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId          会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @param isTop            YES 置顶 , NO 取消置顶
 *  @return 操作结果的bool值
 */
- (BOOL)setConversationToTop:(UCS_IM_ConversationType)conversationType
                    targetId:(NSString *)targetId
                       isTop:(BOOL)isTop;

4、会话的草稿

您可以将用户保留在输入框未发出去的消息保存起来,当用户进入同一会话的聊天界面时填充在输入框中,优化用户体验。

/**
 *  @brief 获取某个会话的文本草稿
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @return 文本草稿。如果没有,为空。
 */
- (NSString *)getTextMessageDraft:(UCS_IM_ConversationType)conversationType
                         targetId:(NSString *)targetId;
 
 
/**
 *  @brief 保存某个会话的文本草稿
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @param content          文本草稿
 *  @return 操作结果的bool值
 */
- (BOOL)saveTextMessageDraft:(UCS_IM_ConversationType)conversationType
                    targetId:(NSString *)targetId
                     content:(NSString *)content;
 
 
/**
 *  @brief 清除某个会话的文本草稿
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @return 操作结果的bool值
 */
- (BOOL)clearTextMessageDraft:(UCS_IM_ConversationType)conversationType
                     targetId:(NSString *)targetId;

5、会话的未读消息数

您可以获取单个会话的未读消息或者全部会话的未读消息总数,显示给用户,提醒用户去查看对应的消息。

/**
 *  @brief 获取某个会话的未读消息数
 *  @discussion 这个方法用来获取某个会话的未读消息数,提醒用户有未读的消息.(如果传入的参数错误或者操作获取失败,会返回-1)
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @return 未读消息数量.(注意:如果传入的参数错误,则直接返回-1)
 */
- (NSInteger)getUnreadCount:(UCS_IM_ConversationType)conversationType
             targetId:(NSString *)targetId;
 
 
/**
 *  @brief 获取所有会话的未读消息总数
 *  @return 未读消息总数
 */
- (NSInteger)getTotalUnreadCount;
 
 
/**
 *  @brief 清空某个会话的未读消息总数
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @return 操作结果的bool值
 */
- (BOOL)clearConversationsUnreadCount:(UCS_IM_ConversationType)conversationType
                             targetId:(NSString *)targetId;

6、会话的消息

您可以在聊天界面加载完成之后,调用下面的方法加载历史消息记录,展示给用户。暂时只能获取本地存储的消息,无法获取服务器存储的消息。

/**
 *  @brief 获取最新的消息.用于进入聊天界面后第一次加载消息
 *  @discussion 这个方法用于进入聊天界面第一次加载消息时候调用,如果下拉加载更多消息的时候请使用下面的 -getLatestMessages:targetId:count: 方法
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @param count            需要获取的消息数量。默认获取20条。也可以自己设置,如果该会话的消息总数小于设置的count数,则返回该会话的消息总数。
 *  @return 消息数组。数组中元素的类型是UCSMessage
 */
- (NSArray *)getLatestMessages:(UCS_IM_ConversationType)conversationType
                      targetId:(NSString *)targetId
                         count:(int)count;
 
 
/**
 *  @brief 获取更多的消息。用于聊天界面中加载更多消息。
 *  @discussion 这个方法用于聊天界面中下拉加载更多消息时候调用。进入聊天界面第一次加载消息请使用上面的 - getLatestMessages:targetId:count: 方法。
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @param oldestMessageId  当前已经请求好的消息中最早的那条消息的消息id。
 *  @param count            需要获取的消息数量
 *  @return 消息数组
 */
- (NSArray *)getHistoryMessages:(UCS_IM_ConversationType)conversationType
                       targetId:(NSString *)targetId
                oldestMessageId:(long long)oldestMessageId
                          count:(int)count;

四、消息

1、发送消息

您可以调用-sendMessage:receiveId:msgType:content:success:failure:方法来发送一条聊天消息。SDK所有的消息发送都使用这个方法,根据不同的参数来区分不同的消息类型。

/**
 *  @brief  发送一条聊天消息
 *  @discussion SDK所有的消息发送都使用这个方法,根据不同的参数来区分不同的消息类型。
 *  @param conversationType 这条消息对应的会话的类型。这个参数用来区分这条消息是什么场景下产生的。现在暂时有单聊、群聊、讨论组三中会话类型。比如一对一单聊,设为UCS_IM_SOLOCHAT。具体参考UCS_IM_ConversationType
 *  @param receiveId        聊天对象的id。这个参数用来标识这条消息发到哪里,单聊发给某个人,群聊发给某个讨论组或者某个群。单聊设置为对方的id,讨论组设置为讨论组id,群聊设置为群id。
 *  @param msgType          消息的类型。这个参数用来标识这条消息的类型。比如文本消息,设置为UCS_IM_TEXT。具体参考UCS_IM_MsgType
 *  @param content          消息实体。这个参数存储发送的内容。UCSMsgContent是一个消息基类,这里传入一个继承UCSMsgContent的子类的对象。比如发送文本消息时,传入UCSTextMsg类型的对象。注意:这里传的内容对象的类型必须和前一个参数msgType类型对应。比如不允许前一个参数传文本类型,后一个参数传图片,否知会出现错误。当传文本消息的时候,文本的长度不要超过1500,否则视为参数错误。当传入图片消息时,单张图片的字节流大小不要超过20M。
 *  @param success          发送消息成功的Block回调。回调中会返回发送成功的消息id,拿到这个id可以做一些自定义的处理。比如刷新消息的发送状态。
 *  @param failure            发送消息失败的Block回调。回调中会返回发送失败的消息id和发送失败的错误对象,自定义处理。
 *  @return 发送的message。此时消息的发送状态为发送中,需要根据success回调和failure回调来改变消息的发送状态。(注意:如果发送的参数不符合要求,会回调失败。发送的文本长度不能超过1500。当发送语音消息时,语音大小不要超120kB,否则会丢失部分语音内容)
 */
- (UCSMessage *)sendMessage:(UCS_IM_ConversationType)conversationType
                  receiveId:(NSString *)receiveId
                    msgType:(UCS_IM_MsgType)msgType
                    content:(UCSMsgContent *)content
                    success:(void (^)(long long messageId))success
                    failure:(void (^)(UCSError *error, long long messageId))failure;

2、删除消息

您可以调用-deleteMessages:targetId:messageId:方法来删除一条聊天消息。被删除的聊天消息将会在数据库中彻底删除。

/**
 *  @brief 删除一条指定的消息
 *  @discussion 这个方法一般用于聊天界面删除一条消息,删除后这条消息在数据库中也会被删除。
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId         会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @param messageId        消息id
 *  @return 操作结果的bool值
 */
- (BOOL)deleteMessages:(UCS_IM_ConversationType)conversationType
              targetId:(NSString *)targetId
             messageId:(long long)messageId;

您也可以删除某个会话的所有消息

/**
 *  @brief 清空某一个会话所有的聊天记录
 *  @param conversationType  会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId          会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id。
 *  @return 操作结果的bool值
 */
- (BOOL)clearMessages:(UCS_IM_ConversationType)conversationType
             targetId:(NSString *)targetId;

3、修改消息的接收状态

您可以调用-setMessageReceivedStatus:targetId:messageId:receivedStatus:方法来修改消息在数据中的接收状态。

/**
 *  @brief 设置接收到的某条消息在本地的接收状态。具体参考UCSReceivedStatus
 *  @param conversationType 会话类型。类型值参考UCS_IM_ConversationType
 *  @param targetId          会话id。单聊为对方的id,讨论组聊天为讨论组id,群组聊天为群组id
 *  @param messageId        消息id。
 *  @param receivedStatus   要设置的状态。类型值参考UCSReceivedStatus
 *  @return 操作结果的bool值
 */
-(BOOL)setMessageReceivedStatus:(UCS_IM_ConversationType)conversationType
                       targetId:(NSString *)targetId
                      messageId:(long long)messageId
                 receivedStatus:(UCSReceivedStatus)receivedStatus;

五、讨论组

讨论组是用户创建的多人聊天室,SDK提供了讨论组创建、加人、踢人、设置、退出、查询等功能。讨论组的创建者将默认为该讨论组的管理员,当管理员退出讨论组后,将重新分配讨论组管理员。

1、创建讨论组

/**
 *  @brief 主动创建一个讨论组
 *  @discussion 这个方法用来主动创建一个讨论组。成功block回调返回一个讨论组,失败block回调返回错误码。创建成功后,创建者会自动变成讨论组的所有者,拥有对讨论组操作的最高权限。
 *  @param topic       创建后的讨论组主题(讨论组名),不能为nil。
 *  @param memberArray 创建时需要邀请到讨论组的成员数组(不需要把自己加进去),数组中每个元素为UCSUserInfo类的对象。加入到这个成员数组的每个成员必须保证是已经在云平台注册的成员,否则会失败。
 *  @param success     创建成功。block回调返回创建成功的讨论组
 *  @param failure     创建失败。block回调返回错误对象。
 */
- (void)createDiscussionWithTopic:(NSString *)topic
                      memberArray:(NSArray *)memberArray
                          success:(void (^)(UCSDiscussion *discussion))success
                          failure:(void (^)(UCSError *error))failure;

2、加人

/**
 *  @brief 给已经存在的讨论组添加新的用户
 *  @discussion  这个方法用来给一个已经存在的讨论组添加新的成员,如果用户无权限进行操作会失败。
 *  @param discussionId 讨论组id
 *  @param memberArray  要新加的成员的数组,数组中的每个元素为UCSUserInfo类的对象。
 *  @param success      添加成功.回调中返回修改后的讨论组
 *  @param failure      添加失败.回调中返回错误对象
 */
- (void)addMemberToDiscussionWithDiscussionId:(NSString *)discussionId
                                  memberArray:(NSArray *)memberArray
                                      success:(void (^)(UCSDiscussion *discussion))success
                                      failure:(void (^)(UCSError *error))failure;

3、踢人

/**
 *  @brief 在讨论组中移除已经存在的用户
 *  @discussion 这个方法用来删除一个存在的讨论组中存在的成员,如果用户无权限进行操作会失败。
 *  @param discussionId 讨论组id
 *  @param memberArray  要移除的用户的数组,数组中的每个元素为UCSUserInfo类的对象。
 *  @param success      移除成功.回调中返回修改后的讨论组
 *  @param failure      移除失败.回调中返回错误对象
 */
- (void)removeMemberFromDiscussionWithDiscussionId:(NSString *)discussionId
                                       memberArray:(NSArray *)memberArray
                                           success:(void (^)(UCSDiscussion *discussion))success
                                           failure:(void (^)(UCSError *error))failure;

4、设置

/**
 *  @brief 修改讨论组的主题(讨论组名称)
 *  @param discussionId 讨论组id
 *  @param newTopic     新的主题
 *  @param success      修改成功。回调中返回修改后的讨论组。
 *  @param failure      修改失败。回调中返回失败的错误对象
 */
- (void)setDiscussionTopicWithDiscussionId:(NSString *)discussionId
                                  newTopic:(NSString *)newTopic
                                   success:(void (^)(UCSDiscussion *discussion))success
                                   failure:(void (^)(UCSError *error))failure;

5、退出

/**
 *  @brief 主动退出讨论组
 *  @param discussionId 讨论组id
 *  @param success      退出成功
 *  @param failure      退出失败。回调中返回错误对象
 */
- (void)quitDiscussionWithDiscussionId:(NSString *)discussionId
                               success:(void (^)(UCSDiscussion *discussion))success
                               failure:(void (^)(UCSError *error))failure;

6、查询

您可以查询自己当前加入的所有讨论组,或者查询当前加入的某一个讨论组。

/**
 *  @brief 获取一个存在的讨论组。如果本地不存在这个讨论组的信息,就会返回空。
 *  @param targetId 讨论组id
 *  @return 讨论组。
 */
- (UCSDiscussion *)getDiscussionInfoWithDiscussionId:(NSString *)targetId;
 
 
/**
 *  @brief  获取当前账号加入的所有讨论组,返回一个数组,其中的每个元素是一个UCSDiscussion类型的对象
 *  @return 返回加入的所有讨论组.如果当前账号没有加入任何讨论组,则数组为空。
 */
- (NSArray *)getDiscussions;

六、群组

群组关系和群组列表由您的 App 维护,客户端的所有群组操作都需要请求您的 App Server, 您的 App Server 可以根据自己的逻辑进行管理和控制,然后通过 Server API 接口进行群组操作,并将结果返回给客户端。

如果您想了解更多,请前往IM服务端开发文档

七、错误码

400000	没有错误				ErrorCode_NoError
401000	未知错误				ErrorCode_UnKnown
401100	连接服务器失败			ErrorCode_ConnectToServerFail
401101	超时				ErrorCode_TIMEOUT 
4001102	被别人踢下线			ErrorCode_BeClicked
4001103	无效的token或者与appid不符合	ErrorCode_InvalidToken
4001104	用户不存在			ErrorCode_InvalidUser
4001105	密码错误		                ErrorCode_IncorrectPassword
4023000	无效的消息,null或者nil	        ErrorCode_InvalidMessage
402301	无效的群组,传入的群组不存在	ErrorCode_InvalidGroud
402302	无效的讨论组,传入的讨论组不存在	ErrorCode_InvalidDiscussion
402303	修改讨论组名字失败	        ErrorCode_UpdateDiscussionNameFail
402304	创建讨论组失败	                ErrorCode_CreateDiscussionFail
402305	用户不在群组中	                ErrorCode_MemberIsNotInGroud
402306	用户不在讨论组中	                ErrorCode_MemberIsNotInDiscussion
402307	删除成员失败		        ErrorCode_DeleteMemberFail
402308	邀请成员失败		        ErrorCode_AddMemberFail
402309	文件上传失败		        ErrorCode_UploadFileFail
402310	文件下载失败		        ErrorCode_downLoadFileFail
402311	录音时间过短                     ErrorCode_RecoderTooShort
402312	文件格式不支持	                ErrorCode_FileFormatIsNotSupported
402313	消息内容过长			ErrorCode_MessageLengthTooLong
402314	读取本地数据库失败	        ErrorCode_SelectFromDataBaseFail 
402315	写入、更新数据库失败	        ErrorCode_UpdateDataBaseFail
402316	发送消息失败		        ErrorCode_SendMessageFail
402317	发送消息超时		        ErrorCode_SendMessageTimeOut
402318	成员列表错误	            	ErrorCode_MembersError
402319	退出讨论组错误	                ErrorCode_ExitDiscussionError
403600	参数错误			        ErrorCode_MethodParamError
403601	消息格式错误	              	ErrorCode_MessageTypeError
403602	网络未连接	              	ErrorCode_NetworkIsNotConnected 
403603	初始化加载失败(包括数据库加载)	ErrorCode_InitError
403604	服务器重连失败	                ErrorCode_ReConnectToServerFail
403605	错误IP地址		        ErrorCode_ErrorIPAddress 
403606  包解析错误                       ErrorCode_PacketParsingError