一、iOS 直播聊天室 Demo 說明
1祈争、源碼結構
2店枣、AppDelegate
在 AppDelegate 中初始化融云旺上。
[[RCDLive sharedRCDLive] initRongCloud:RONGCLOUD_IM_APPKEY];
3辟狈、RCDLive
管理融云核心類肠缔,所有與融云交互的接口調用以及消息監(jiān)聽都在這里實現 如果您使用融云 IMkit UI 庫,可以設置成 1 哼转,如果您的 APP 中只使用融云的底層通訊庫 IMLib 明未,請把 IsUseRongCloudIMKit 設置成 0(如果使用 IMKit 引入 RongIMKit.Framework ,可以把 RCDLive.m 中注釋掉的使用的 RongIMKit.Framework 中的相關類的代碼放開)
4壹蔓、LoginViewController
登錄頁面亚隅,Demo 中直接通過請求融云的服務器來獲取用戶的 Token ,實際開發(fā)過程中這個過程需要您的服務器來完成(這樣可以避免泄露您的 APPkey 和 APPSecret),關于如何獲取 Token 請參考?如何獲取Token?電視:播放器支持播放網絡上的一些網絡電視庶溶,具體參考對集成的視頻播放器的廠商官方說明煮纵。 主播:可以實時顯示直播端的推流。(進入空白是因為主播推流端此時沒有推流偏螺,推流 Demo 可以參考直播廠商官方 Demo )
5行疏、RCDLiveChatRoomViewController
聊天室頁面,集成了視頻播放和聊天套像,用戶可以看視頻直播的同時酿联,發(fā)消息或者禮物來互動,?
6夺巩、RCDLiveInputBar
輸入框部分集成了 Emoji 表情
Emoji 表情輸入
鍵盤輸入
7贞让、播放器 Demo 默認集成了金山播放器,同時還做了其他廠家播放器的集成柳譬,可以參考 Live 目錄下的文件
UCLOUD (上海優(yōu)刻得信息科技有限公司)
QCLOUD (騰訊)
QINIU (七牛)
LE (樂視)
KSY (金山) (目錄中的類庫由于體積大以及沖突的關系喳张,已經去掉,部分代碼也注釋掉了美澳,可以到對應廠家的官網下載添加即可)
8销部、收發(fā)消息 RCDLive.m 里封裝了收發(fā)消息的方法,如果使用的 IMKit 可以設置實現代理 RCIMReceiveMessageDelegate制跟,參考?IMKit 接收消息舅桩。 如果使用的 IMLib 可以設置實現代理 RCIMClientReceiveMessageDelegate,參考?IMLib 接收消息雨膨。
9擂涛、消息顯示 Demo 除了實現了顯示 SDK 中的文本消息 RCTextMessage 之外,還自定義了禮物消息 RCDLiveGiftMessage 聊记,關于自定義消息請參考?IMLib 自定義消息?以及?IMKit 自定義消息Cell
10撒妈、用戶信息(頭像、名字) 由于聊天室業(yè)務場景的特點甥雕,成員大多具有隨機性踩身,所有我們可以在發(fā)送消息的時候將用戶信息(頭像、名字)附加到消息里社露,在接收到消息的時候再將用戶信息解析出來挟阻。 融云所有的消息繼承自 RCMessageContent 類,類里有發(fā)送這信息的屬性 senderUserInfo 峭弟,在新建消息發(fā)送的時候可以給這個信息附上當前登錄用戶的信息附鸽。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
打開終端肆捕,進入到您的工程目錄刷晋,執(zhí)行以下命令,會自動生成一個 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臼寄。
我們建議您鎖定版本呆馁,便于團隊開發(fā)客们。如居灯,指定 2.4.X 版本榔至。
pod'RongCloudIMKit','2.4.X'
2) 升級本地 CocoaPods 源
CocoaPods 有一個中心化的源庆械,默認本地會緩存 CocoaPods 源服務器上的所有 SDK 版本铛纬。
如果搜索的時候沒有搜到融云的 SDK 或者搜不到最新的 SDK 版本嫉戚,可以執(zhí)行以下命令更新一下本地的緩存蹬挺。
pod repo update
3) 升級工程的 SDK 版本
更新您工程目錄中 Podfile 指定的 SDK 版本后维贺,在終端中執(zhí)行以下命令。
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>
請使用您之前從融云開發(fā)者控制臺注冊得到的 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厢拭。
我們在開發(fā)者控制臺提供了 API 調試的功能,在開發(fā)初期階段撇叁,您可以通過其中獲取 Token 功能供鸠,手動獲取 Token 進行測試。
6陨闹、登錄
將您在上一步獲取到的 Token楞捂,通過 RCIMClient 的單例,傳入 -connectWithToken:success:error:tokenIncorrect: 方法趋厉,即可建立與服務器的連接寨闹。
在 App 整個生命周期,您只需要調用一次此方法與融云服務器建立連接君账。之后無論是網絡出現異撤北ぃ或者 App 有前后臺的切換等,SDK 都會負責自動重連。
SDK 針對 iOS 的前后臺和各種網絡狀況椭蹄,進行了連接和重連機制的優(yōu)化闻牡,建議您調用一次 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 過期扎筒,是因為您在開發(fā)者后臺設置了 token 過期時間,您需要請求您的服務器重新獲取token 并再次用新的 token 建立連接酬姆。
@warning 如果您使用 IMLib嗜桌,請使用此方法建立與融云服務器的連接;
如果您使用 IMKit辞色,請使用 RCIM 中的同名方法建立與融云服務器的連接骨宠,而不要使用此方法。
在 tokenIncorrectBlock 的情況下相满,您需要請求您的服務器重新獲取 token 并建立連接层亿,但是注意避免無限循環(huán),以免影響 App 用戶體驗立美。 此方法的回調并非為原調用線程匿又,您如果需要進行 UI 操作,請注意切換到主線程建蹄。
*/
- (void)connectWithToken:(NSString*)token? ? ?
? ? ? ? ? success:(void(^)(NSString*userId))successBlock? ? ? ? ? ? ? ? ?
error:(void(^)(RCConnectErrorCode status))errorBlock? ? ? ? ?
tokenIncorrect:(void(^)())tokenIncorrectBlock;
7碌更、加入聊天室
用戶需要加入聊天室之后,才能在聊天室里面接收和發(fā)送消息洞慎。
SDK 提供了兩個加入聊天室的接口:
1)只加入已經存在的聊天室痛单,如果聊天室不存在則失敗
2)加入聊天室,如果聊天室不存在劲腿,會自動創(chuàng)建并加入聊天室
您可以根據您的 App 邏輯選擇使用旭绒。
//RCIMClient Class
/*
! 加入聊天室(如果聊天室不存在則會創(chuàng)建)
@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 加入聊天室(聊天室不存在會自動創(chuàng)建),如果您只想加入已存在的聊天室脉幢,需要在 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、發(fā)送消息
加入了聊天室之后髓废,就可以發(fā)送消息巷懈。
SDK 提供以下接口,用于發(fā)送文本慌洪、語音顶燕、自定義等消息。
如果您是在聊天室中發(fā)送消息冈爹,則 conversationType 設置為 ConversationType_CHATROOM涌攻,pushContent 和 pushData 可以設置為 nil(因為聊天室沒有消息推送)。
//RCIMClient Class/
*!
發(fā)送消息
@param conversationType? ? 發(fā)送消息的會話類型
@param targetId? ? ? ? ? ? 發(fā)送消息的目標會話 ID
@param content? ? ? ? ? ? 消息的內容
@param pushContent? ? ? ? 接收方離線時需要顯示的遠程推送內容
@param pushData? ? ? ? ? ? 接收方離線時需要在遠程推送中攜帶的非顯示數據
@param successBlock? ? ? ? 消息發(fā)送成功的回調 [messageId:消息的 ID]
@param errorBlock? ? ? ? ? 消息發(fā)送失敗的回調 [nErrorCode:發(fā)送失敗的錯誤碼, messageId:消息的 ID]
@return? ? ? ? ? ? ? ? ? ? 發(fā)送的消息實體
@discussion 當接收方離線并允許遠程推送時犯助,會收到遠程推送癣漆。 遠程推送中包含兩部分內容,一是 pushContent剂买,用于顯示惠爽;二是 pushData,用于攜帶不顯示的數據瞬哼。
SDK 內置的消息類型婚肆,如果您將 pushContent 和 pushData 置為 nil,會使用默認的推送格式進行遠程推送坐慰。 自定義類型的消息较性,需要您自己設置 pushContent 和 pushData 來定義推送內容用僧,否則將不會進行遠程推送。
如果您使用此方法發(fā)送圖片消息赞咙,需要您自己實現圖片的上傳责循,構建一個 RCImageMessage 對象, 并將 RCImageMessage 中的 imageUrl 字段設置為上傳成功的 URL 地址攀操,然后使用此方法發(fā)送院仿。
@warning 如果您使用 IMLib,可以使用此方法發(fā)送消息速和;
如果您使用 IMKit歹垫,請使用 RCIM 中的同名方法發(fā)送消息,否則不會自動更新 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 還提供以下接口排惨,用于發(fā)送圖片消息。
如果您是在聊天室中發(fā)送圖片消息碰凶,則 conversationType 設置為 ConversationType_CHATROOM暮芭,pushContent 和 pushData 可以設置為 nil(因為聊天室沒有消息推送)。
//RCIMClient Class
/*!
發(fā)送圖片消息
@param conversationType? ? 發(fā)送消息的會話類型
@param targetId? ? ? ? ? ? 發(fā)送消息的目標會話 ID
@param content? ? ? ? ? ? 消息的內容
@param pushContent? ? ? ? 接收方離線時需要顯示的遠程推送內容
@param pushData? ? ? ? ? ? 接收方離線時需要在遠程推送中攜帶的非顯示數據
@param progressBlock? ? ? 消息發(fā)送進度更新的回調 [progress:當前的發(fā)送進度, 0 <= progress <= 100, messageId:消息的 ID]
@param successBlock? ? ? ? 消息發(fā)送成功的回調 [messageId:消息的 ID]
@param errorBlock? ? ? ? ? 消息發(fā)送失敗的回調 [errorCode:發(fā)送失敗的錯誤碼, messageId:消息的 ID]
@return? ? ? ? ? ? ? ? ? ? 發(fā)送的消息實體
@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:方法進行發(fā)送,不要使用此方法其徙。
@warning 如果您使用 IMKit胚迫,使用此方法發(fā)送圖片消息 SDK 會自動更新 UI;
如果您使用 IMLib唾那,請使用 RCIMClient 中的同名方法發(fā)送圖片消息访锻,不會自動更新 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、監(jiān)聽消息接收
SDK 提供消息接收的監(jiān)聽接口期犬。
//RCIMClient Class
/*!
設置IMlib的消息接收監(jiān)聽器
@param delegate? ? IMLib 消息接收監(jiān)聽器
@param userData? ? 用戶自定義的監(jiān)聽器 Key 值河哑,可以為 nil
@discussion
設置 IMLib 的消息接收監(jiān)聽器請參考 RCIMClient的setReceiveMessageDelegate:object:方法。
userData 為您自定義的任意數據龟虎,SDK 會在回調的 onReceived:left:object:方法中傳入作為 object 參數璃谨。
您如果有設置多個監(jiān)聽,會只有最終的一個監(jiān)聽器起作用遣总,您可以通過該 userData 值區(qū)分您設置的監(jiān)聽器睬罗。如果不需要直接設置為 nil 就可以。
@warning 如果您使用 IMlib旭斥,可以設置并實現此 Delegate 監(jiān)聽消息接收容达;
如果您使用 IMKit,請使用 RCIM 中的 receiveMessageDelegate 監(jiān)聽消息接收垂券,而不要使用此方法花盐,否則會導致 IMKit 中無法自動更新 UI!
*/
- (void)setReceiveMessageDelegate:(id)delegate? ? ? ? ? ? ? ? ? ? ? ? ?
object:(id)userData;
/*!
IMlib 消息接收的監(jiān)聽器
@discussion
設置 IMLib 的消息接收監(jiān)聽器請參考 RCIMClient的setReceiveMessageDelegate:object:方法菇爪。
@warning 如果您使用 IMlib算芯,可以設置并實現此 Delegate 監(jiān)聽消息接收;
如果您使用 IMKit凳宙,請使用 RCIM 中的 RCIMReceiveMessageDelegate 監(jiān)聽消息接收熙揍,而不要使用此監(jiān)聽器,否則會導致 IMKit 中無法自動更新 UI氏涩!*/@protocolRCIMClientReceiveMessageDelegate
/*!
接收消息的回調方法
@param message? ? 當前接收到的消息
@param nLeft? ? ? 還剩余的未接收的消息數届囚,left>=0
@param object? ? ? 消息監(jiān)聽設置的 key 值
@discussion 如果您設置了 IMlib 消息監(jiān)聽之后,SDK 在接收到消息時候會執(zhí)行此方法是尖。
其中意系,left 為還剩余的、還未接收的消息數量饺汹。比如剛上線一口氣收到多條消息時蛔添,通過此方法,您可以獲取到每條消息兜辞,left 會依次遞減直到 0迎瞧。
您可以根據 left 數量來優(yōu)化您的 App 體驗和性能,比如收到大量消息時等待 left 為 0 再刷新 UI逸吵。
object 為您在設置消息接收監(jiān)聽時的 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 服務支持一個用戶同時加入多個聊天室咏尝,所以您監(jiān)聽到消息接收的時候压语,按您 App 的邏輯處理和顯示消息的時候,需要判斷 targetId 以區(qū)分是哪個聊天室编检。 如果您設置了消息接收的監(jiān)聽胎食,需要在該監(jiān)聽對象銷毀的時候設置為 nil 釋放監(jiān)聽。
11允懂、插入消息
SDK 提供插入消息的接口厕怜,可以實現界面上和發(fā)送的消息效果一樣,但是沒有真正發(fā)送出去的效果蕾总。
//RCIMClient Class
/*!
插入消息
@param conversationType? ? 會話類型
@param targetId? ? ? ? ? ? 目標會話 ID
@param senderUserId? ? ? ? 消息發(fā)送者的用戶 ID
@param sendStatus? ? ? ? ? 發(fā)送狀態(tài)
@param content? ? ? ? ? ? 消息的內容
@return? ? ? ? ? ? ? ? ? ? 插入的消息實體
@warning 目前僅支持插入向外發(fā)送的消息粥航,不支持插入接收的消息。
*/
- (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 就可以收發(fā)消息。
當界面上需要顯示用戶信息(名字市俊、頭像)的時候杨凑,App 需要根據 userId 在自己的用戶體系中查到對應的用戶信息并顯示。
SDK 中針對聊天室的 IM 場景摆昧,在消息內容中設計了 senderUserInfo 字段撩满。
App 可以在發(fā)送消息的時候,攜帶發(fā)送者自己的用戶信息(名字绅你、頭像)鹦牛,接收方在收到消息的時候可以根據此字段的信息進行 UI 展示。
//RCMessageContent Class
/*!
消息內容中攜帶的發(fā)送者的用戶信息
@discussion
如果您使用 IMKit勇吊,可以通過 RCIM 的 enableMessageAttachUserInfo 屬性設置在每次發(fā)送消息中攜帶發(fā)送者的用戶信息。
*/
@property(nonatomic, strong) RCUserInfo *senderUserInfo;
我們建議窍仰,如果您 App 只使用聊天室功能汉规,則可以通過 senderUserInfo 傳遞并顯示用戶信息。
如果您以后需要集成 IMKit 來擴展更多功能驹吮,則還需要實現用戶信息提供者和群組信息提供者等協議针史,更多內容可以參考iOS IMKit 開發(fā)指南。
14碟狞、連接狀態(tài)監(jiān)聽
SDK 提供了自動重連功能啄枕,只要調用一次 connectWithToken,之后無論是網絡出現異匙逦郑或者 App 有前后臺的切換等频祝,SDK 都會負責自動重連泌参。 SDK 還提供了連接狀態(tài)監(jiān)聽的接口。
//RCIMClient Class
/*!
設置 IMLib 的連接狀態(tài)監(jiān)聽器
@param delegate? ? IMLib 連接狀態(tài)監(jiān)聽器
@warning 如果您使用 IMLib常空,可以設置并實現此 Delegate 監(jiān)聽連接狀態(tài)變化沽一;
如果您使用 IMKit,請使用 RCIM 中的 connectionStatusDelegate 監(jiān)聽連接狀態(tài)變化漓糙,而不要使用此方法铣缠,否則會導致 IMKit 中無法自動更新 UI!
*/
- (void)setRCConnectionStatusChangeDelegate:? ? (id)delegate;
/*!
IMLib 連接狀態(tài)的的監(jiān)聽器
@discussion
設置 IMLib 的連接狀態(tài)監(jiān)聽器昆禽,請參考 RCIMClient setRCConnectionStatusChangeDelegate: 方法蝗蛙。
@warning 如果您使用 IMLib,可以設置并實現此 Delegate 監(jiān)聽連接狀態(tài)變化醉鳖;
如果您使用 IMKit捡硅,請使用 RCIM 中的 RCIMConnectionStatusDelegate 監(jiān)聽消息接收,而不要使用此監(jiān)聽器辐棒,否則會導致 IMKit 中無法自動更新 UI病曾!
*/
@protocolRCConnectionStatusChangeDelegate/*! IMLib 連接狀態(tài)的的監(jiān)聽器
@param status? SDK 與融云服務器的連接狀態(tài)
@discussion 如果您設置了 IMLib 消息監(jiān)聽之后,當 SDK 與融云服務器的連接狀態(tài)發(fā)生變化時漾根,會回調此方法泰涂。
*/
- (void)onConnectionStatusChanged:(RCConnectionStatus)status;
如果您設置了連接狀態(tài)的監(jiān)聽,需要在該監(jiān)聽對象銷毀的時候設置為 nil 釋放監(jiān)聽辐怕。
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 可以自定義任意類型和數據結構的消息來滿足您的業(yè)務需求宛蚓。
自定義消息需要實現以下幾部分內容:
繼承 RCMessageContent 并實現消息的編解碼激捏、存儲等協議(必須)
向 SDK 中注冊該類型的消息(必須)
App 中該類型消息的處理和 UI 顯示(可選)
1) ?繼承 RCMessageContent 并實現消息的編解碼、存儲等協議
RCMessageContent 是消息內容類远舅,是所有消息的基類闰蛔。您可以繼承此類,并實現其中的協議图柏,來實現自定義消息序六。
RCMessageContent 主要有三個協議:
編解碼協議 RCMessageCoding
存儲協議 RCMessagePersistentCompatible
內容摘要協議 RCMessageContentView(可選)
其中,RCMessageCoding 主要需要實現三個功能:提供消息唯一標識符蚤吹、消息發(fā)送時將消息中的所有信息編碼為 json 數據傳輸、消息接收時將 json 數據解碼還原為消息對象。
RCMessagePersistentCompatible 用于確定消息內容的存儲策略尽楔,需要指明此消息類型在本地是否存儲盹靴、是否計入未讀消息數。
我們建議二驰,一般不需要顯示的命令類的消息扔罪,可以設置為不存儲不計數的。
RCMessageContentView 用于在會話列表和本地通知中顯示消息的摘要桶雀,主要用于 IMKit 中的 UI 顯示矿酵,如果您沒有集成 IMKit 的計劃,可選矗积。
自定義消息發(fā)送流程
自定義消息接收流程?
//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 已經可以正常收發(fā)自定義消息了诅炉。 這時候,App 可能需要按照自己的業(yè)務邏輯屋厘,做好這種消息的UI顯示和處理工作涕烧。 這部分是可選的,完全取決于 App 的業(yè)務汗洒。
三议纯、集成 IMKit 擴展更多功能
1.?SDK 錯誤碼說明
錯誤碼 ? ? ? ? ? 原因 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 處理
30001 ? 連接已被釋放 ? 建立連接的臨時錯誤碼,SDK 會做好自動重連溢谤,開發(fā)者無須處理瞻凤。
30002 ? 連接不可用 ? ? ? 建立連接的臨時錯誤碼,SDK 會做好自動重連世杀,開發(fā)者無須處理阀参。
30003 ? 請求響應超時 ? 建立連接的臨時錯誤碼,SDK 會做好自動重連瞻坝,開發(fā)者無須處理蛛壳。
30004 ? 導航 HTTP發(fā)送失敗 ?建立連接的臨時錯誤碼,SDK 會做好自動重連,開發(fā)者無須處理炕吸。
30007 ? 導航 HTTP 請求失敗 ?建立連接的臨時錯誤碼,SDK 會做好自動重連勉痴,開發(fā)者無須處理赫模。
30008 ? 導航 HTTP 返回數據格式錯誤 ?建立連接的臨時錯誤碼,SDK 會做好自動重連蒸矛,開發(fā)者無須處理瀑罗。
30010 ? 創(chuàng)建 Socket 連接失敗 ?建立連接的臨時錯誤碼,SDK 會做好自動重連雏掠,開發(fā)者無須處理斩祭。
30011 ? Socket 斷開 ? ? ? 建立連接的臨時錯誤碼,SDK 會做好自動重連乡话,開發(fā)者無須處理摧玫。
30012 ? PING 失敗 ? ? ? ? 建立連接的臨時錯誤碼,SDK 會做好自動重連绑青,開發(fā)者無須處理诬像。
30013 ? PING 超時 ? ? ? ? 建立連接的臨時錯誤碼,SDK 會做好自動重連闸婴,開發(fā)者無須處理坏挠。
30014 ? 信令發(fā)送失敗 ? 建立連接的臨時錯誤碼,SDK 會做好自動重連邪乍,開發(fā)者無須處理降狠。
30015 ? 連接過于頻繁 ? 建立連接的臨時錯誤碼,SDK 會做好自動重連庇楞,開發(fā)者無須處理榜配。
31000 ? 連接 ACK 超時 ?建立連接的臨時錯誤碼,SDK 會做好自動重連姐刁,開發(fā)者無須處理芥牌。
31001 ? 信令版本錯誤 ? 建立連接的臨時錯誤碼,SDK 會做好自動重連聂使,開發(fā)者無須處理壁拉。
31002 ? AppKey 錯誤 ? ?請檢查您使用的 AppKey 是否正確。
31003 ? 服務器當前不可用(預留) ?建立連接的臨時錯誤碼柏靶,SDK 會做好自動重連弃理,開發(fā)者無須處理。
31004 ? Token 無效 ? ? ? ?Token 無效一般有以下兩種原因屎蜓。一是 token 錯誤痘昌,請您檢查客戶端初始化使用的 AppKey 和您服務器獲取 token 使用的 AppKey 是否一致;二是 token 過期,是因為您在開發(fā)者后臺設置了 token 過期時間辆苔,您需要請求您的服務器重新獲取 token 并再次用新的 token 建立連接算灸。
31005 ? AppKey 與 Token 不匹配 ?請檢查您使用的 AppKey 與 Token 是否正確,是否匹配驻啤。一般有以下兩種原因菲驴。一是 token 錯誤,請您檢查客戶端初始化使用的 AppKey 和您服務器獲取 token 使用的 AppKey 是否一致骑冗;二是 token 過期赊瞬,是因為您在開發(fā)者后臺設置了 token 過期時間,您需要請求您的服務器重新獲取 token 并再次用新的 token 建立連接贼涩。
31006 ? 連接重定向 ? ?建立連接的臨時錯誤碼巧涧,SDK 會做好自動重連,開發(fā)者無須處理遥倦。
31007 ? BundleID 不正確 ?請檢查您 App 的 BundleID 是否正確谤绳。
31008 ? AppKey 被封禁或已刪除 ?請檢查您使用的 AppKey 是否正確。
31009 ? 用戶被封禁 ? ? ?建立連接的臨時錯誤碼袒哥,SDK 會做好自動重連闷供,開發(fā)者無須處理。
31010 ? 當前用戶在其他設備上登陸统诺,此設備被踢下線 ?App 自行處理歪脏,如提醒用戶等。
31011 ? 與服務器的連接已斷開 ?建立連接的臨時狀態(tài)粮呢,SDK 會做好自動重連婿失,開發(fā)者無須處理。
33001 ? SDK 沒有初始化 ?在使用 SDK 任何功能之前啄寡,必須先 Init豪硅。
33002 ? 數據庫錯誤 ? ? 請檢查您使用的 Token 和 userId 是否正確。
33003 ? 開發(fā)者接口調用時傳入的參數錯誤 ?請檢查接口調用時傳入的參數類型和值挺物。
33007 ? 歷史消息云存儲業(yè)務未開通 ?App 需要先開通該業(yè)務懒浮。
-1 ? ? ? ? ? 未知錯誤(預留)
405 ? ? ? ?已被對方加入黑名單 ?當前操作失敗,App 按照自己的邏輯處理识藤,如提醒用戶等砚著。
5004 ? ? ?超時 ? ? ? ? ? ? ?當前操作失敗,App 按照自己的邏輯處理痴昧,如提醒用戶等稽穆。
20604 ? 發(fā)送消息頻率過高,1 秒鐘最多只允許發(fā)送 5 條消息 ? 當前操作失敗赶撰,App 按照自己的邏輯處理舌镶,如提醒用戶等柱彻。
21406 ? 不在該討論組中 ? 當前操作失敗,App 按照自己的邏輯處理餐胀,如提醒用戶等哟楷。
22406 ? 不在該群組中 ? 當前操作失敗,App 按照自己的邏輯處理否灾,如提醒用戶等吓蘑。
22408 ? 在群組中已被禁言 ? 當前操作失敗,App 按照自己的邏輯處理坟冲,如提醒用戶等。
23406 ? 不在該聊天室中 ? 當前操作失敗溃蔫,App 按照自己的邏輯處理健提,如提醒用戶等。
23408 ? 在該聊天室中已被禁言 ? 當前操作失敗伟叛,App 按照自己的邏輯處理私痹,如提醒用戶等。
23409 ? 已被踢出聊天室 ? 當前操作失敗统刮,App 按照自己的邏輯處理紊遵,如提醒用戶等。
23410 ? 聊天室不存在 ? ? ? 當前操作失敗侥蒙,App 按照自己的邏輯處理暗膜,如提醒用戶等。
23411 ? ?聊天室成員超限(預留)