【直播聊天室】ios源码

一、iOS 直播聊天室 Demo 说明

1、源码结构


2、AppDelegate

在 AppDelegate 中初始化融云。

[[RCDLive sharedRCDLive] initRongCloud:RONGCLOUD_IM_APPKEY];

3、RCDLive

管理融云核心类,所有与融云交互的接口调用以及消息监听都在这里实现 如果您使用融云 IMkit UI 库,可以设置成 1 ,如果您的 APP 中只使用融云的底层通讯库 IMLib ,请把 IsUseRongCloudIMKit 设置成 0(如果使用 IMKit 引入 RongIMKit.Framework ,可以把 RCDLive.m 中注释掉的使用的 RongIMKit.Framework 中的相关类的代码放开)

4、LoginViewController


登录页面,Demo 中直接通过请求融云的服务器来获取用户的 Token ,实际开发过程中这个过程需要您的服务器来完成(这样可以避免泄露您的 APPkey 和 APPSecret),关于如何获取 Token 请参考 如何获取Token 电视:播放器支持播放网络上的一些网络电视,具体参考对集成的视频播放器的厂商官方说明。 主播:可以实时显示直播端的推流。(进入空白是因为主播推流端此时没有推流,推流 Demo 可以参考直播厂商官方 Demo )

5、RCDLiveChatRoomViewController

聊天室页面,集成了视频播放和聊天,用户可以看视频直播的同时,发消息或者礼物来互动, 


6、RCDLiveInputBar

输入框部分集成了 Emoji 表情

Emoji 表情输入


键盘输入


7、播放器 Demo 默认集成了金山播放器,同时还做了其他厂家播放器的集成,可以参考 Live 目录下的文件

UCLOUD (上海优刻得信息科技有限公司)

QCLOUD (腾讯)

QINIU (七牛)

LE (乐视)

KSY (金山) (目录中的类库由于体积大以及冲突的关系,已经去掉,部分代码也注释掉了,可以到对应厂家的官网下载添加即可)


8、收发消息 RCDLive.m 里封装了收发消息的方法,如果使用的 IMKit 可以设置实现代理 RCIMReceiveMessageDelegate,参考 IMKit 接收消息。 如果使用的 IMLib 可以设置实现代理 RCIMClientReceiveMessageDelegate,参考 IMLib 接收消息

9、消息显示 Demo 除了实现了显示 SDK 中的文本消息 RCTextMessage 之外,还自定义了礼物消息 RCDLiveGiftMessage ,关于自定义消息请参考 IMLib 自定义消息 以及 IMKit 自定义消息Cell

10、用户信息(头像、名字) 由于聊天室业务场景的特点,成员大多具有随机性,所有我们可以在发送消息的时候将用户信息(头像、名字)附加到消息里,在接收到消息的时候再将用户信息解析出来。 融云所有的消息继承自 RCMessageContent 类,类里有发送这信息的属性 senderUserInfo ,在新建消息发送的时候可以给这个信息附上当前登录用户的信息。messageContent.senderUserInfo = currentUserInfo;

自定义消息在实现的 encode 方法中要将 senderUserInfo 序列化到消息中,参考 Demo 中 RCDLiveGiftMessage 消息的实现。 在 decodeWithData 方法中 调用 [self decodeUserInfo:userinfoDic];对 senderUserInfo 解析 在 encode 方法中,需要将 senderUserInfo 序列化到 Json 数据中

二、聊天室集成指南

1、集成 SDK

融云开源的直播聊天室基于 IMLib 实现,有两种方式可以将 SDK 导入您的项目中。

1) 通过 CocoaPods 管理依赖

2) 手动导入 SDK 并管理依赖

CocoaPods 是目前最流行的 Cocoa 项目库依赖管理工具之一,考虑到便捷与项目的可维护性,我们更推荐您使用 CocoaPods 导入并管理 SDK。

2、使用 CocoaPods 导入 SDK

1) CocoaPods 安装

如果您的机器上已经安装了 CocoaPods,直接进入下一步即可。

如果您的网络已经翻墙,在终端中运行如下命令直接安装:

sudo gem install cocoapods

如果您的网络不能翻墙,可以通过淘宝的 RubyGems 镜像 进行安装。

在终端依次运行以下命令:

gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/

sudo gem install cocoapods

2) 查询 CocoaPods 源中的融云 SDK

在终端中运行以下命令:

pod search RongCloudIM

如果运行以上命令,没有搜到融云的 SDK 或者搜不到最新的 SDK 版本,您可以运行以下命令,更新一下您本地的 CocoaPods 源列表。

pod repo update

您可以看到,融云在 CocoaPods 上提供了三种 SDK 下载,IMLib、不包含 VoIP 功能的 IMKit、包含 VoIP 功能的 IMKit。

直播聊天室 Demo 使用 IMlib。

3) 使用 CocoaPods 导入融云 SDK

打开终端,进入到您的工程目录,执行以下命令,会自动生成一个 Podfile 文件。

pod init

打开 Podfile,在您项目的 target 下加入以下内容。(在此以 2.4.0 版本为例)

pod 'RongCloudIMLib', '2.4.0'

然后在终端中运行以下命令:

pod install

完成后,CocoaPods 会在您的工程根目录下生成一个 .xcworkspace 文件。您需要通过此文件打开您的工程,而不是之前的 .xcodeproj。

4) 设置 App 支持 http

iOS 9 中,Apple 引入了新特性 App Transport Security (ATS),默认要求 App 必须使用 https 协议。详情:What's New in iOS 9.0

融云 SDK 在 iOS9 上需要使用 http,您需要设置在 App 中使用 http。

在 App 的 Info.plist 中添加 NSAppTransportSecurity 类型 Dictionary。

在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型 Boolean,值设为 YES。

CocoaPods 使用说明

1) 指定 SDK 版本 CocoaPods 中,有几种设置 SDK 版本的方法。如:

'>= 2.4.X' 会根据您本地的 CocoaPods 源列表,导入不低于 2.4.X 版本的 SDK。

'> 2.4.X' 会根据您本地的 CocoaPods 源列表,介于 2.4.X2.5.0 之前版本的 SDK。

我们建议您锁定版本,便于团队开发。如,指定 2.4.X 版本。

pod'RongCloudIMKit','2.4.X'

2) 升级本地 CocoaPods 源

CocoaPods 有一个中心化的源,默认本地会缓存 CocoaPods 源服务器上的所有 SDK 版本。

如果搜索的时候没有搜到融云的 SDK 或者搜不到最新的 SDK 版本,可以执行以下命令更新一下本地的缓存。

pod repo update

3) 升级工程的 SDK 版本

更新您工程目录中 Podfile 指定的 SDK 版本后,在终端中执行以下命令。

pod update

4) 清除 Cocoapods 本地缓存

特殊情况下,由于网络或者别的原因,通过 CocoaPods 下载的文件可能会有问题。

这时候您可以删除 CocoaPods 的缓存(~/Library/Caches/CocoaPods/Pods/Release 目录),再次导入即可。

5) 查看当前使用的 SDK 版本

您可以在 Podfile.lock 文件中看到您工程中使用的 SDK 版本。

关于 CocoaPods 的更多内容,您可以参考 CocoaPods 文档

3、手动导入 SDK

1) 下载 SDK

您可以到 融云官方网站 下载融云 SDK。

2) 导入 SDK

SDK 文件说明

下载的 SDK 中包含以下文件:


文件                                          说明                                                  注意事项

RongIMLib.framework        IMlib的framework库                           必须导入

libopencore-amrnb.a          第三方开源语音库                              必须导入

RCConfig.plist                    有特殊定制需求的用户使用              可选,一般用户不需要导入

release_notes_ios.txt         版本变更的说明文档                         仅说明,非工程必须文件

3) 添加系统库依赖

您除了在工程中导入 SDK 之前,还需要添加如下系统库的引用。

AssetsLibrary.framework

AudioToolbox.framework

AVFoundation.framework

CFNetwork.framework

CoreAudio.framework

CoreGraphics.framework

CoreLocation.framework

CoreMedia.framework

CoreTelephony.framework

CoreVideo.framework

ImageIO.framework

libc++.tbd

libc++abi.tbd

libsqlite3.tbd

libstdc++.tbd

libxml2.tbd

libz.tbd

MapKit.framework

OpenGLES.framework

QuartzCore.framework

SystemConfiguration.framework

UIKit.framework

Photos.framework

4) 设置 App 支持 http

iOS 9 中,Apple 引入了新特性 App Transport Security (ATS),默认要求 App 必须使用 https 协议。详情:What's New in iOS 9.0

融云 SDK 在 iOS9 上需要使用 http,您需要设置在 App 中使用 http。

在 App 的 Info.plist 中添加 NSAppTransportSecurity 类型 Dictionary。

在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型 Boolean,值设为 YES。

5) 查看当前使用的 SDK 版本

手动导入的 SDK 版本,在 Folder 中打开 RongIMLib.framework, 该目录下有一个 Info.plist 文件,打开即可看见版本号。


4、初始化

在您需要使用融云 SDK 功能的类中,import 相关头文件。

#import <RongIMLib/RongIMLib.h>

请使用您之前从融云开发者控制台注册得到的 App Key,通过 RCIMClient 的单例,传入 initWithAppKey: 方法,初始化 SDK。

您在使用融云 SDK 所有功能之前,您必须先调用此方法初始化 SDK。 在 App 的整个生命周期中,您只需要将 SDK 初始化一次。

[[RCIMClientsharedRCIMClient]initWithAppKey:@"YourTestAppKey"];

5、获取Token

Token 即用户令牌,相当于您 APP 上当前用户连接融云的身份凭证。

在您连接融云服务器之前,您需要请求您的 App Server,您的 App Server 通过 Server API 获取 Token 并返回给您的客户端,客户端获取到这个 Token 即可进入下一步连接融云服务器。

为什么必须在服务器端请求 Token,客户端不提供获取 Token 的接口?

因为获取 Token 时需要提供 App Key 和 App Secret 。如果在客户端请求 Token,假如您的 App 代码一旦被反编译,则会导致您的 App Key 和 App Secret 泄露。所以,务必在您的服务器端获取 Token。

我们在开发者控制台提供了 API 调试的功能,在开发初期阶段,您可以通过其中获取 Token 功能,手动获取 Token 进行测试。

6、登录

将您在上一步获取到的 Token,通过 RCIMClient 的单例,传入 -connectWithToken:success:error:tokenIncorrect: 方法,即可建立与服务器的连接。

在 App 整个生命周期,您只需要调用一次此方法与融云服务器建立连接。之后无论是网络出现异常或者 App 有前后台的切换等,SDK 都会负责自动重连。

SDK 针对 iOS 的前后台和各种网络状况,进行了连接和重连机制的优化,建议您调用一次 connectWithToken 即可,其余交给 SDK 处理。 除非您已经手动将连接断开,否则您不需要自己再手动重连。

//RCIMClient Class

/*!

与融云服务器建立连接

@param token                  从您服务器端获取的 token(用户身份令牌)

@param successBlock            连接建立成功的回调

[userId:当前连接成功所用的用户 ID]

@param errorBlock              连接建立失败的回调 [status:连接失败的错误码]

@param tokenIncorrectBlock    token 错误或者过期的回调

@discussion 在 App 整个生命周期,您只需要调用一次此方法与融云服务器建立连接。

之后无论是网络出现异常或者 App 有前后台的切换等,SDK 都会负责自动重连。

除非您已经手动将连接断开,否则您不需要自己再手动重连。

tokenIncorrectBlock 有两种情况:

一是 token 错误,请您检查客户端初始化使用的 AppKey 和您服务器获取 token 使用的 AppKey 是否一致;

二是 token 过期,是因为您在开发者后台设置了 token 过期时间,您需要请求您的服务器重新获取token 并再次用新的 token 建立连接。

@warning 如果您使用 IMLib,请使用此方法建立与融云服务器的连接;

如果您使用 IMKit,请使用 RCIM 中的同名方法建立与融云服务器的连接,而不要使用此方法。

在 tokenIncorrectBlock 的情况下,您需要请求您的服务器重新获取 token 并建立连接,但是注意避免无限循环,以免影响 App 用户体验。 此方法的回调并非为原调用线程,您如果需要进行 UI 操作,请注意切换到主线程。

*/

- (void)connectWithToken:(NSString*)token     

          success:(void(^)(NSString*userId))successBlock                 

error:(void(^)(RCConnectErrorCode status))errorBlock         

tokenIncorrect:(void(^)())tokenIncorrectBlock;

7、加入聊天室

用户需要加入聊天室之后,才能在聊天室里面接收和发送消息。

SDK 提供了两个加入聊天室的接口:

1)只加入已经存在的聊天室,如果聊天室不存在则失败

2)加入聊天室,如果聊天室不存在,会自动创建并加入聊天室

您可以根据您的 App 逻辑选择使用。

//RCIMClient Class

/*

! 加入聊天室(如果聊天室不存在则会创建)

@param targetId                聊天室 ID

@param messageCount 进入聊天室时获取历史消息的数量,-1<=messageCount<=50 @param successBlock            加入聊天室成功的回调

@param errorBlock              加入聊天室失败的回调

[status:加入聊天室失败的错误码]

@discussion

可以通过传入的 messageCount 设置加入聊天室成功之后,需要获取的历史消息数量。

-1 表示不获取任何历史消息,0 表示不特殊设置而使用 SDK 默认的设置(默认为获取 10 条),0<messageCount <=50 为具体获取的消息数量,最大值为 50。

   */

      - (void)joinChatRoom:(NSString*)targetId

                messageCount:(int)messageCount

                      success:(void(^)())successBlock

                        error:(void(^)(RCErrorCode status))errorBlock;

    /*!

    加入已经存在的聊天室(如果不存在或超限会返回聊天室不存在错误 23410 或 人数超限23411)

@param targetId                聊天室 ID

@param messageCount进入聊天室时获取历史消息的数量,-1<=messageCount<=50

 @param successBlock            加入聊天室成功的回调

@param errorBlock              加入聊天室失败的回调

[status:加入聊天室失败的错误码]

@warning

注意:使用 Kit 库的会话页面 viewDidLoad 会自动调用 joinChatRoom 加入聊天室(聊天室不存在会自动创建),如果您只想加入已存在的聊天室,需要在 push 到会话页面之前调用这个方法并且 messageCount

传 -1,成功之后 push 到会话页面,失败需要您做相应提示处理

@discussion

可以通过传入的 messageCount 设置加入聊天室成功之后,需要获取的历史消息数量。

-1表示不获取任何历史消息,0 表示不特殊设置而使用 SDK 默认的设置(默认为获取 10 条),0 <messageCount<=50 为具体获取的消息数量,最大值为 50。

*/

         - (void)joinExistChatRoom:(NSString*)targetId

                      messageCount:(int)messageCount

                           success:(void(^)())successBlock

                             error:(void(^)(RCErrorCode status))errorBlock;

8、退出聊天室

用户退出聊天室之后,就不再收到该聊天室的消息。

//RCIMClient Class

/*!

退出聊天室

@param targetId                聊天室 ID

@param successBlock            退出聊天室成功的回调

@param errorBlock              退出聊天室失败的回调

[status:退出聊天室失败的错误码]

*/

- (void)quitChatRoom:(NSString*)targetId           

success:(void(^)())successBlock             

error:(void(^)(RCErrorCode status))errorBlock;

9、发送消息

加入了聊天室之后,就可以发送消息。

SDK 提供以下接口,用于发送文本、语音、自定义等消息。

如果您是在聊天室中发送消息,则 conversationType 设置为 ConversationType_CHATROOM,pushContent 和 pushData 可以设置为 nil(因为聊天室没有消息推送)。

//RCIMClient Class/

*!

发送消息

@param conversationType    发送消息的会话类型

@param targetId            发送消息的目标会话 ID

@param content            消息的内容

@param pushContent        接收方离线时需要显示的远程推送内容

@param pushData            接收方离线时需要在远程推送中携带的非显示数据

@param successBlock        消息发送成功的回调 [messageId:消息的 ID]

@param errorBlock          消息发送失败的回调 [nErrorCode:发送失败的错误码, messageId:消息的 ID]

@return                    发送的消息实体

@discussion 当接收方离线并允许远程推送时,会收到远程推送。 远程推送中包含两部分内容,一是 pushContent,用于显示;二是 pushData,用于携带不显示的数据。

SDK 内置的消息类型,如果您将 pushContent 和 pushData 置为 nil,会使用默认的推送格式进行远程推送。 自定义类型的消息,需要您自己设置 pushContent 和 pushData 来定义推送内容,否则将不会进行远程推送。

如果您使用此方法发送图片消息,需要您自己实现图片的上传,构建一个 RCImageMessage 对象, 并将 RCImageMessage 中的 imageUrl 字段设置为上传成功的 URL 地址,然后使用此方法发送。

@warning 如果您使用 IMLib,可以使用此方法发送消息;

如果您使用 IMKit,请使用 RCIM 中的同名方法发送消息,否则不会自动更新 UI。

*/

- (RCMessage *)sendMessage:(RCConversationType)conversationType     

            targetId:(NSString*)targetId                 

content:(RCMessageContent *)content             

pushContent:(NSString*)pushContent                 

pushData:(NSString*)pushData                 

success:(void(^)(longmessageId))successBlock                   

error:(void(^)(RCErrorCode nErrorCode,

longmessageId))errorBlock;

SDK 还提供以下接口,用于发送图片消息。

如果您是在聊天室中发送图片消息,则 conversationType 设置为 ConversationType_CHATROOM,pushContent 和 pushData 可以设置为 nil(因为聊天室没有消息推送)。

//RCIMClient Class

/*!

发送图片消息

@param conversationType    发送消息的会话类型

@param targetId            发送消息的目标会话 ID

@param content            消息的内容

@param pushContent        接收方离线时需要显示的远程推送内容

@param pushData            接收方离线时需要在远程推送中携带的非显示数据

@param progressBlock      消息发送进度更新的回调 [progress:当前的发送进度, 0 <= progress <= 100, messageId:消息的 ID]

@param successBlock        消息发送成功的回调 [messageId:消息的 ID]

@param errorBlock          消息发送失败的回调 [errorCode:发送失败的错误码, messageId:消息的 ID]

@return                    发送的消息实体

@discussion 当接收方离线并允许远程推送时,会收到远程推送。 远程推送中包含两部分内容,一是 pushContent,用于显示;二是 pushData,用于携带不显示的数据。

SDK内置的消息类型,如果您将 pushContent 和 pushData 置为 nil,会使用默认的推送格式进行远程推送。 自定义类型的消息,需要您自己设置 pushContent 和 pushData 来定义推送内容,否则将不会进行远程推送。

如果您需要上传图片到自己的服务器,构建一个 RCImageMessage 对象, 并将 RCImageMessage 中的 imageUrl 字段设置为上传成功的 URL 地址,然后使用 RCIMClient 的 sendMessage:targetId:content:pushContent:pushData:success:error:方法或 sendMessage:targetId:content:pushContent:success:error:方法进行发送,不要使用此方法。

@warning 如果您使用 IMKit,使用此方法发送图片消息 SDK 会自动更新 UI;

如果您使用 IMLib,请使用 RCIMClient 中的同名方法发送图片消息,不会自动更新 UI。

*/

- (RCMessage *)

sendImageMessage:(RCConversationType)conversationType       

targetId:(NSString*)targetId       

content:(RCMessageContent *)content   

pushContent:(NSString*)pushContent       

pushData:(NSString*)pushData       

progress:(void(^)(intprogress,longmessageId))progressBlock       

success:(void(^)(longmessageId))successBlock         

error:(void(^)(RCErrorCode errorCode,longmessageId))errorBlock;

10、监听消息接收

SDK 提供消息接收的监听接口。

//RCIMClient Class

/*!

设置IMlib的消息接收监听器

@param delegate    IMLib 消息接收监听器

@param userData    用户自定义的监听器 Key 值,可以为 nil

@discussion

设置 IMLib 的消息接收监听器请参考 RCIMClient的setReceiveMessageDelegate:object:方法。

userData 为您自定义的任意数据,SDK 会在回调的 onReceived:left:object:方法中传入作为 object 参数。

您如果有设置多个监听,会只有最终的一个监听器起作用,您可以通过该 userData 值区分您设置的监听器。如果不需要直接设置为 nil 就可以。

@warning 如果您使用 IMlib,可以设置并实现此 Delegate 监听消息接收;

如果您使用 IMKit,请使用 RCIM 中的 receiveMessageDelegate 监听消息接收,而不要使用此方法,否则会导致 IMKit 中无法自动更新 UI!

*/

- (void)setReceiveMessageDelegate:(id)delegate                         

object:(id)userData;

/*!

IMlib 消息接收的监听器

@discussion

设置 IMLib 的消息接收监听器请参考 RCIMClient的setReceiveMessageDelegate:object:方法。

@warning 如果您使用 IMlib,可以设置并实现此 Delegate 监听消息接收;

如果您使用 IMKit,请使用 RCIM 中的 RCIMReceiveMessageDelegate 监听消息接收,而不要使用此监听器,否则会导致 IMKit 中无法自动更新 UI!*/@protocolRCIMClientReceiveMessageDelegate

/*!

接收消息的回调方法

@param message    当前接收到的消息

@param nLeft      还剩余的未接收的消息数,left>=0

@param object      消息监听设置的 key 值

@discussion 如果您设置了 IMlib 消息监听之后,SDK 在接收到消息时候会执行此方法。

其中,left 为还剩余的、还未接收的消息数量。比如刚上线一口气收到多条消息时,通过此方法,您可以获取到每条消息,left 会依次递减直到 0。

您可以根据 left 数量来优化您的 App 体验和性能,比如收到大量消息时等待 left 为 0 再刷新 UI。

object 为您在设置消息接收监听时的 key 值。

*/

- (void)onReceived:(RCMessage *)message left:(int)nLeft object:(id)object;

@optional

/*!

消息被撤回的回调方法

@param messageId 被撤回的消息 ID

@discussion 被撤回的消息会变更为 RCRecallNotificationMessage,App 需要在 UI 上刷新这条消息。

*/

- (void)onMessageRecalled:(long)messageId;

@end

因为融云 IM 服务支持一个用户同时加入多个聊天室,所以您监听到消息接收的时候,按您 App 的逻辑处理和显示消息的时候,需要判断 targetId 以区分是哪个聊天室。 如果您设置了消息接收的监听,需要在该监听对象销毁的时候设置为 nil 释放监听。

11、插入消息

SDK 提供插入消息的接口,可以实现界面上和发送的消息效果一样,但是没有真正发送出去的效果。

//RCIMClient Class

/*!

插入消息

@param conversationType    会话类型

@param targetId            目标会话 ID

@param senderUserId        消息发送者的用户 ID

@param sendStatus          发送状态

@param content            消息的内容

@return                    插入的消息实体

@warning 目前仅支持插入向外发送的消息,不支持插入接收的消息。

*/

- (RCMessage *)insertMessage:(RCConversationType)conversationType     

              targetId:(NSString*)targetId               

senderUserId:(NSString*)senderUserId                 

sendStatus:(RCSentStatus)sendStatus                   

content:(RCMessageContent *)content;

12、删除消息

SDK 提供了两种删除消息的接口。

1) 删除指定 MessageId 的一系列消息

2) 删除某个会话(聊天室)中的所有消息

//RCIMClient Class

/*!

删除消息

@param messageIds  消息 ID 的列表

@return            是否删除成功

*/

- (BOOL)deleteMessages:(NSArray*)messageIds;

/*!

删除某个会话中的所有消息

@param conversationType    会话类型,不支持聊天室

@param targetId            目标会话 ID

@return                    是否删除成功

*/

- (BOOL)clearMessages:(RCConversationType)conversationType           

targetId:(NSString*)targetId;

13、用户信息显示

融云 IM 不管理 App 的用户体系和好友关系,只要有一个合法的 UserId 就可以收发消息。

当界面上需要显示用户信息(名字、头像)的时候,App 需要根据 userId 在自己的用户体系中查到对应的用户信息并显示。

SDK 中针对聊天室的 IM 场景,在消息内容中设计了 senderUserInfo 字段。

App 可以在发送消息的时候,携带发送者自己的用户信息(名字、头像),接收方在收到消息的时候可以根据此字段的信息进行 UI 展示。

//RCMessageContent Class

/*!

消息内容中携带的发送者的用户信息

@discussion

如果您使用 IMKit,可以通过 RCIM 的 enableMessageAttachUserInfo 属性设置在每次发送消息中携带发送者的用户信息。

*/

@property(nonatomic, strong) RCUserInfo *senderUserInfo;

我们建议,如果您 App 只使用聊天室功能,则可以通过 senderUserInfo 传递并显示用户信息。

如果您以后需要集成 IMKit 来扩展更多功能,则还需要实现用户信息提供者和群组信息提供者等协议,更多内容可以参考iOS IMKit 开发指南

14、连接状态监听

SDK 提供了自动重连功能,只要调用一次 connectWithToken,之后无论是网络出现异常或者 App 有前后台的切换等,SDK 都会负责自动重连。 SDK 还提供了连接状态监听的接口。

//RCIMClient Class

/*!

设置 IMLib 的连接状态监听器

@param delegate    IMLib 连接状态监听器

@warning 如果您使用 IMLib,可以设置并实现此 Delegate 监听连接状态变化;

如果您使用 IMKit,请使用 RCIM 中的 connectionStatusDelegate 监听连接状态变化,而不要使用此方法,否则会导致 IMKit 中无法自动更新 UI!

*/

- (void)setRCConnectionStatusChangeDelegate:    (id)delegate;

/*!

IMLib 连接状态的的监听器

@discussion

设置 IMLib 的连接状态监听器,请参考 RCIMClient setRCConnectionStatusChangeDelegate: 方法。

@warning 如果您使用 IMLib,可以设置并实现此 Delegate 监听连接状态变化;

如果您使用 IMKit,请使用 RCIM 中的 RCIMConnectionStatusDelegate 监听消息接收,而不要使用此监听器,否则会导致 IMKit 中无法自动更新 UI!

*/

@protocolRCConnectionStatusChangeDelegate/*! IMLib 连接状态的的监听器

@param status  SDK 与融云服务器的连接状态

@discussion 如果您设置了 IMLib 消息监听之后,当 SDK 与融云服务器的连接状态发生变化时,会回调此方法。

*/

- (void)onConnectionStatusChanged:(RCConnectionStatus)status;

如果您设置了连接状态的监听,需要在该监听对象销毁的时候设置为 nil 释放监听。


15、断开连接

在断开与融云服务器的连接的时候,您可以设置是否该客户端是否接收消息的远程推送(聊天室的消息没有远程推送)。

我们针对断开连接之后是否接收远程推送,提供了以下三个接口,您按照您的需求,调用其中一个即可。

//RCIMClient Class

/*!

断开与融云服务器的连接

@param isReceivePush  App 在断开连接之后,是否还接收远程推送

@discussion 因为 SDK 在前后台切换或者网络出现异常都会自动重连,会保证连接的可靠性。

所以除非您的 App 逻辑需要登出,否则一般不需要调用此方法进行手动断开。

@warning 如果您使用 IMLib,请使用此方法断开与融云服务器的连接;

如果您使用 IMKit,请使用 RCIM 中的同名方法断开与融云服务器的连接,而不要使用此方法。

isReceivePush 指断开与融云服务器的连接之后,是否还接收远程推送。

[[RCIMClient sharedRCIMClient] disconnect:YES]与[[RCIMClient sharedRCIMClient] disconnect]完全一致;

[[RCIMClient sharedRCIMClient] disconnect:NO]与[[RCIMClient sharedRCIMClient] logout]完全一致。

您只需要按照您的需求,使用 disconnect:与 disconnect 以及 logout 三个接口其中一个即可。

*/

- (void)disconnect:(BOOL)isReceivePush;

/*!

断开与融云服务器的连接,但仍然接收远程推送

@discussion 因为 SDK 在前后台切换或者网络出现异常都会自动重连,会保证连接的可靠性。

所以除非您的 App 逻辑需要登出,否则一般不需要调用此方法进行手动断开。

@warning 如果您使用 IMLib,请使用此方法断开与融云服务器的连接;

如果您使用 IMKit,请使用 RCIM 中的同名方法断开与融云服务器的连接,而不要使用此方法。

[[RCIMClient sharedRCIMClient] disconnect:YES]与[[RCIMClient sharedRCIMClient] disconnect]完全一致;

[[RCIMClient sharedRCIMClient] disconnect:NO]与[[RCIMClient sharedRCIMClient] logout]完全一致。

您只需要按照您的需求,使用 disconnect: 与 disconnect 以及 logout 三个接口其中一个即可。

*/

- (void)disconnect;

/*!

断开与融云服务器的连接,并不再接收远程推送

@discussion 因为 SDK 在前后台切换或者网络出现异常都会自动重连,会保证连接的可靠性。

所以除非您的 App 逻辑需要登出,否则一般不需要调用此方法进行手动断开。

@warning 如果您使用 IMKit,请使用此方法断开与融云服务器的连接;

如果您使用 IMLib,请使用 RCIMClient 中的同名方法断开与融云服务器的连接,而不要使用此方法。

[[RCIMClient sharedRCIMClient] disconnect:YES]与[[RCIMClient sharedRCIMClient] disconnect]完全一致;

[[RCIMClient sharedRCIMClient] disconnect:NO]与[[RCIMClient sharedRCIMClient] logout]完全一致。

您只需要按照您的需求,使用 disconnect: 与 disconnect 以及 logout 三个接口其中一个即可。

*/

- (void)logout;


16、自定义消息

如果 SDK 预置的消息类型不能满足您的需求,App 可以自定义任意类型和数据结构的消息来满足您的业务需求。

自定义消息需要实现以下几部分内容:

继承 RCMessageContent 并实现消息的编解码、存储等协议(必须)

向 SDK 中注册该类型的消息(必须)

App 中该类型消息的处理和 UI 显示(可选)

1)  继承 RCMessageContent 并实现消息的编解码、存储等协议

RCMessageContent 是消息内容类,是所有消息的基类。您可以继承此类,并实现其中的协议,来实现自定义消息。

RCMessageContent 主要有三个协议:

编解码协议 RCMessageCoding

存储协议 RCMessagePersistentCompatible

内容摘要协议 RCMessageContentView(可选)

其中,RCMessageCoding 主要需要实现三个功能:提供消息唯一标识符、消息发送时将消息中的所有信息编码为 json 数据传输、消息接收时将 json 数据解码还原为消息对象。

RCMessagePersistentCompatible 用于确定消息内容的存储策略,需要指明此消息类型在本地是否存储、是否计入未读消息数。

我们建议,一般不需要显示的命令类的消息,可以设置为不存储不计数的。

RCMessageContentView 用于在会话列表和本地通知中显示消息的摘要,主要用于 IMKit 中的 UI 显示,如果您没有集成 IMKit 的计划,可选。

自定义消息发送流程

自定义消息接收流程 

//RCMessageContent Class

@interfaceRCMessageContent

: NSObject <RCMessageCoding, RCMessagePersistentCompatible,                           RCMessageContentView >

...

@end

/*!

消息内容的编解码协议

@discussion 用于标示消息内容的类型,进行消息的编码和解码。

所有自定义消息必须实现此协议,否则将无法正常传输和使用。*/

@protocolRCMessageCoding< NSObject >

@required

/*!

将消息内容序列化,编码成为可传输的 json 数据

@discussion

消息内容通过此方法,将消息中的所有数据,编码成为 json 数据,返回的 json 数据将用于网络传输。

*/- (NSData*)encode

;/*!

将 json 数据的内容反序列化,解码生成可用的消息内容

@param data    消息中的原始 json 数据

@discussion

网络传输的 json 数据,会通过此方法解码,获取消息内容中的所有数据,生成有效的消息内容。

*/

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

/*!

返回消息的类型名

@return 消息的类型名

@discussion 您定义的消息类型名,需要在各个平台上保持一致,以保证消息互通。

@warning 请勿使用 @"RC:" 开头的类型名,以免和 SDK 默认的消息名称冲突

*/

+ (NSString*)getObjectName;

@end

/*!

消息内容的存储协议

@discussion 用于确定消息内容的存储策略。

所有自定义消息必须实现此协议,否则将无法正常存储和使用。

*/

@protocolRCMessagePersistentCompatible< NSObject >

@required

/*!

返回消息的存储策略

@return 消息的存储策略

@discussion 指明此消息类型在本地是否存储、是否计入未读消息数。

*/

+ (RCMessagePersistent)persistentFlag;

@end

/*!

消息内容摘要的协议

@discussion 用于在会话列表和本地通知中显示消息的摘要。

*/

@protocolRCMessageContentView

@optional

/*!

返回在会话列表和本地通知中显示的消息内容摘要

@return 会话列表和本地通知中显示的消息内容摘要

@discussion

如果您使用 IMKit,当会话的最后一条消息为自定义消息时,需要通过此方法获取在会话列表展现的内容摘要;

当 App 在后台收到消息时,需要通过此方法获取在本地通知中展现的内容摘要。

*/

- (NSString*)conversationDigest;

@end

2)  向 SDK 中注册该类型的消息

您需要在初始化 SDK 之后,向 SDK 注册该类型的消息。自定义消息只有注册了,SDK 才能识别和编解码这种类型的消息。

//RCIMClient Class

/*!

注册自定义的消息类型

@param messageClass    自定义消息的类,该自定义消息需要继承于 RCMessageContent

@discussion

如果您需要自定义消息,必须调用此方法注册该自定义消息的消息类型,否则 SDK 将无法识别和解析该类型消息。

@warning 如果您使用 IMLib,请使用此方法注册自定义的消息类型;

如果您使用 IMKit,请使用 RCIM 中的同名方法注册自定义的消息类型,而不要使用此方法。

*/

- (void)registerMessageType:(Class)messageClass;

3) App 中该类型消息的处理和UI显示

以上步骤都实现之后,App 已经可以正常收发自定义消息了。 这时候,App 可能需要按照自己的业务逻辑,做好这种消息的UI显示和处理工作。 这部分是可选的,完全取决于 App 的业务。

三、集成 IMKit 扩展更多功能

1. SDK 错误码说明

错误码           原因                                                       处理

30001   连接已被释放   建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30002   连接不可用       建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30003   请求响应超时   建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30004   导航 HTTP发送失败  建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30007   导航 HTTP 请求失败  建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30008   导航 HTTP 返回数据格式错误  建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30010   创建 Socket 连接失败  建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30011   Socket 断开       建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30012   PING 失败         建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30013   PING 超时         建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30014   信令发送失败   建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30015   连接过于频繁   建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31000   连接 ACK 超时  建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31001   信令版本错误   建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31002   AppKey 错误    请检查您使用的 AppKey 是否正确。

31003   服务器当前不可用(预留)  建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31004   Token 无效        Token 无效一般有以下两种原因。一是 token 错误,请您检查客户端初始化使用的 AppKey 和您服务器获取 token 使用的 AppKey 是否一致;二是 token 过期,是因为您在开发者后台设置了 token 过期时间,您需要请求您的服务器重新获取 token 并再次用新的 token 建立连接。

31005   AppKey 与 Token 不匹配  请检查您使用的 AppKey 与 Token 是否正确,是否匹配。一般有以下两种原因。一是 token 错误,请您检查客户端初始化使用的 AppKey 和您服务器获取 token 使用的 AppKey 是否一致;二是 token 过期,是因为您在开发者后台设置了 token 过期时间,您需要请求您的服务器重新获取 token 并再次用新的 token 建立连接。

31006   连接重定向    建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31007   BundleID 不正确  请检查您 App 的 BundleID 是否正确。

31008   AppKey 被封禁或已删除  请检查您使用的 AppKey 是否正确。

31009   用户被封禁      建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31010   当前用户在其他设备上登陆,此设备被踢下线  App 自行处理,如提醒用户等。

31011   与服务器的连接已断开  建立连接的临时状态,SDK 会做好自动重连,开发者无须处理。

33001   SDK 没有初始化  在使用 SDK 任何功能之前,必须先 Init。

33002   数据库错误     请检查您使用的 Token 和 userId 是否正确。

33003   开发者接口调用时传入的参数错误  请检查接口调用时传入的参数类型和值。

33007   历史消息云存储业务未开通  App 需要先开通该业务。

-1           未知错误(预留)

405        已被对方加入黑名单  当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

5004      超时              当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

20604   发送消息频率过高,1 秒钟最多只允许发送 5 条消息   当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

21406   不在该讨论组中   当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

22406   不在该群组中   当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

22408   在群组中已被禁言   当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

23406   不在该聊天室中   当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

23408   在该聊天室中已被禁言   当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

23409   已被踢出聊天室   当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

23410   聊天室不存在       当前操作失败,App 按照自己的逻辑处理,如提醒用户等。

23411    聊天室成员超限(预留)


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 基本概念 一、融云直播聊天室介绍 融云直播聊天室,是专门为视频直播业务提供的一个产品。主要特点是: 1.可以支持无...
    ajiao焦阅读 2,592评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,387评论 25 707
  • 为方便开发者了解和接入融云直播聊天室,本文将介绍融云直播聊天室功能特点、主要构成及常见功能的解决方案。 一、产品介...
    ajiao焦阅读 2,651评论 0 2
  • 曾经我们相遇, 后来却因为各种理由我们不能一起, 但是我们依然在为了自己的理想勇敢向前, 也许我们被现实打击得伤痕...
    简静_20f6阅读 692评论 0 0