一睦刃、即時通訊
什么是即時通訊不瓶?
- 即時通訊棚放,又稱實時通訊
- 即時通信(Instant Messaging枚粘,簡稱IM)是一個實時通信系統(tǒng),允許兩人或多人使用網(wǎng)絡(luò)實時的傳遞文字消息飘蚯、文件馍迄、語音與視頻交流
- 即時通訊在開發(fā)中使用的場景
- 開發(fā)一個類型于微信福也,QQ,易信的聊天軟件
- 在電商APP集成買家與賣家的實時溝通等
- 當(dāng)前時下攀圈,實現(xiàn)即時通訊的方案
- 1.XMPP
- 2.環(huán)信
二暴凑、XMPP
XMPP是什么?
- (1).XMPP:The Extensible Messaging and Presence
Protocol(可擴(kuò)展通訊和表示協(xié)議) - (2).XMPP是一種基于XML的即時通訊協(xié)議赘来,XMPP的官方文檔是RFC 3920
- 這個文檔定義了登錄现喳,退出,獲取好友撕捍,發(fā)送消息等等的XML數(shù)據(jù)傳輸協(xié)議
- (3).XMPP是一個典型的C/S架構(gòu)拿穴,基本的網(wǎng)絡(luò)形式是客戶端通過TCP/IP連接到服務(wù)器,通過Socket建立連接忧风,然后在之上傳輸XML流
- (4).XMPP是一種類似于HTTP協(xié)議的一種數(shù)據(jù)傳輸協(xié)議默色,其過程就如同“解包裝 --〉包裝”的過程。只需要理解其接收的類型及返回的類型狮腿,便可以很好的利用XMPP來進(jìn)行數(shù)據(jù)通訊
- (5).XMPP官方網(wǎng)站——http://xmpp.org
XMPP實現(xiàn)即時通信的準(zhǔn)備工作
1-下載Openfire服務(wù)器
2-下載XMPPFramework框架
三腿宰、環(huán)信
什么是環(huán)信?
- 環(huán)信是一個第三平臺缘厢,提供即時通信(IM –Instant Messaging )的服務(wù)
- 環(huán)信是在XMPP的基礎(chǔ)上進(jìn)行二次開發(fā)
- 環(huán)信在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)也是XML
- 使用環(huán)信吃度,不用自己搭建服務(wù)器,節(jié)約成本
- 環(huán)信日活30萬以下,永遠(yuǎn)免費(fèi)
- 2015年上半年易觀發(fā)布中國移動IM云報告贴硫,環(huán)信穩(wěn)居市場第一
- 公司如要開發(fā)即時通訊軟件椿每,建議首選環(huán)信,環(huán)信占用市場份額較大
集成環(huán)信的前提準(zhǔn)備
注冊成為環(huán)信開發(fā)者
http://www.easemob.com在開發(fā)者后臺創(chuàng)建APP獲取Key
-
官方SDKDEMO
http://www.easemob.com/docs/ios/IOSSDKPrepare/
集成環(huán)信的前提準(zhǔn)備.png 根據(jù)官網(wǎng)導(dǎo)入SDK和相應(yīng)依賴
初始化應(yīng)用,有兩個方法
/*
*registerSDKWithAppKey:區(qū)別app的標(biāo)識,開發(fā)者注冊及管理后臺apnsCertName:iOS中推送證書名稱英遭。制作與上傳推送證書
*/
//環(huán)信的初始化
// [[EaseMob sharedInstance] registerSDKWithAppKey:@"MG#MGChat"
ap sCertName:@””];
//環(huán)信的初始化
并隱藏日志輸出
[[EaseMob sharedInstance] registerSDKWithAppKey:@"MG#MGChat" apnsCertName:@"" otherConfig:@{kSDKConfigEnableConsoleLogger:@(NO)}];```

- 注冊
[[EaseMob
sharedInstance].chatManager asyncRegisterNewAccount:”MG” password:”123456” withCompletion:^(NSString *username, NSString *password,EMError *eror) {
NSLog(@"error:%@,username:%@,pwd:%@",error,username,password);
} onQueue:nil];```
- 自動登錄
- 自動登錄:當(dāng)然程序再次啟動時间护,如果用戶已經(jīng)成功登錄過,不需要用戶再輸入用戶名和密碼進(jìn)行登錄
- 實現(xiàn)方法
(1)把登錄帳號信息保存下來挖诸,程序起動發(fā)送登錄請求
(2)環(huán)信已經(jīng)實現(xiàn)了自動登錄汁尺,只需要在第一次登錄成功后調(diào)用 下面的方法即可
[[EaseMobsharedInstance].chatManagersetIsAutoLoginEnabled:YES];
- 總結(jié):不管哪種方法,實質(zhì)都是再次調(diào)用了登錄的網(wǎng)絡(luò)請求
- 掉線自動登錄
-如果網(wǎng)絡(luò)不通過多律,用戶應(yīng)該自動連接到服務(wù)器,以及時接收消息- 此功能無需程序員自己做痴突,環(huán)信框架已實現(xiàn),環(huán)信SDK會調(diào)用自動連接的代理方法來通知應(yīng)用程序
/*!
@method
@brief 將要發(fā)起自動重連操作時發(fā)送該回調(diào)
@discussion
@result
*/
- (void)willAutoReconnect;
/*!
@method
@brief 自動重連操作完成后的回調(diào)(成功的話,error為nil狼荞,失敗的話辽装,查看error的錯誤信息)
@discussion
@result
*/
- (void)didAutoReconnectFinishedWithError:(NSError*)error;```
***
- 好友
- 上面的協(xié)議的實現(xiàn)了對用戶的基本操作,如
(1)添加好友
(2)從本地獲取好友列表
(3)從服務(wù)器獲取最新好友列表
(4)接收好友添加請求
(5)刪除好友
(6)被好友從名單上刪除
***
- 聊天
環(huán)信消息發(fā)送的流程
1.先把記錄保存到Conversation表
2.接著發(fā)送網(wǎng)絡(luò)請求相味,API如下
[[EaseMob sharedInstance].chatManager asyncSendMessage:message progress:self prepare:^(EMMessage *message, EMError *error) {
NSLog(@"prepare %@",message.messageBodies);
} onQueue:nil completion:^(EMMessage *message, EMError *error) {
NSLog(@"完成%@",message.messageBodies);
} onQueue:nil];```
步驟
①先獲取EMConversation會話管理者對象
②調(diào)用EMConversation的
- (NSArray*)loadNumbersOfMessages:(NSUInteger) aCountbefore:(long long)timestamp;
獲取指定的聊天記錄環(huán)信提供會話管理者(EMConversation)來管理未讀消息數(shù)和歷史聊天記錄,具體代碼如下
總的未讀消息數(shù)需要遍歷conversations
// 1.獲取所有歷史會話
NSArray *conversations = [[EaseMob sharedInstance].chatManager conversations];
// 2.如果內(nèi)存中拾积,沒有會話,從數(shù)據(jù)庫中加載
if(conversations.count == 0)
{
conversations = [[EaseMob sharedInstance].chatManager loadAllConversationsFromDatabaseWithAppend2Chat:YES];
}```

- 當(dāng)進(jìn)入聊天頁面時,需要設(shè)置所有當(dāng)前會話信息或者設(shè)置已經(jīng)加載的消息為已讀
// 設(shè)置當(dāng)前會話所有消息都為已讀
[self.conversation markAllMessagesAsRead:YES];
//設(shè)置某條消息為已讀
[self.conversation markMessageWithId:<#(NSString *)#> asRead:<#(BOOL)#>]```
- 語言消息
-
在錄音前導(dǎo)入環(huán)信封裝的兩個錄音框架殷勘,如圖
導(dǎo)入錄音的框架.png - 剛才導(dǎo)入的兩個框架,已經(jīng)實現(xiàn)了錄音Api
-
// 開始錄音
[[EMCDDeviceManager
sharedInstance]
asyncStartRecordingWithFileName:fileName completion:^(NSError *error){
if(error) {
NSLog(@"failure to start recording");
}
}];
// 結(jié)束錄音
[[EMCDDeviceManager sharedInstance] asyncStopRecordingWithCompletion:^(NSString *recordPath, NSInteger aDuration, NSError *error) {
NSLog(@"%@",recordPath);
}];```
// 語音對象
EMChatVoice *voice = [[EMChatVoice alloc] initWithFile:filePath displayName:@"audio"];
//消息體
EMVoiceMessageBody *body = [[EMVoiceMessageBody alloc] initWithChatObject:voice];
EMMessage *message = [[EMMessage alloc] initWithReceiver:self.buddy.username bodies:@[body]];
message.messageType = eMessageTypeChat;// 私聊
// 不加密
message.requireEncryption = NO;
// 播放完成
[[EMCDDeviceManager sharedInstance] asyncPlayingWithPath:filePath completion:^(NSError *error) {
NSLog(@"播放完成%@",error);
}];```
- 退出(異步方法)
[[EaseMobsharedInstance].chatManagerasyncLogoffWithUnbindDeviceToken:YEScompletion:^(NSDictionary *info, EMError *error) {
if (!error) {//退出成功
}else{//退出失敗;
}
}
onQueue:nil];```
***
***
***
***
***
***
#補(bǔ)充三點(diǎn)總結(jié):
###使用XMPP遇到的問題
- 發(fā)送附件(圖片昔搂,語音玲销,文檔…)時比較麻煩
- XMPP框架沒有提供發(fā)送附件的功能,需要自己實現(xiàn)
- 實現(xiàn)方法摘符,把文件上傳到文件服務(wù)器贤斜,上傳成功后獲取文件保存路徑,再把附件的路徑發(fā)送給好友
***
###XMPP的實現(xiàn)原理
- XMPP是一個即時通訊的協(xié)議逛裤,它規(guī)范了用于即時通信在網(wǎng)絡(luò)上數(shù)據(jù)傳輸格式的瘩绒,比如登錄,獲取好友列表等等的格式带族。XMPP在網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)是XML格式
- 比如登錄:把用戶名和密碼放在xml的標(biāo)簽中锁荔,傳輸?shù)椒?wù)器
- XMPP是一個基于個Socket通過的網(wǎng)絡(luò)協(xié)議,目的是為了保存長連接蝙砌,以實現(xiàn)即時通訊功能
- XMPP的客戶端是使用一個XMPPFramework框架實現(xiàn)
- XMPP的服務(wù)器是使用Openfire,一個開源的服務(wù)器
- 客戶端獲取到服務(wù)器發(fā)送過來的好友消息阳堕,客戶端需要對XML進(jìn)行解析,使用的解析框架的KissXML框架择克,而不是NSXMLParser/GDataXML
***
###簡單的說下環(huán)信的實現(xiàn)原理
- 環(huán)信是一個即時通信的服務(wù)提供商
- 環(huán)信使用的是XMPP協(xié)議恬总,它是再XMPP的基礎(chǔ)上進(jìn)行二次開發(fā),對服務(wù)器Openfire和客戶端進(jìn)行功能模型的添加和客戶端SDK的封裝肚邢,環(huán)信的本質(zhì)還是使用XMPP壹堰,基本于Socket的網(wǎng)絡(luò)通信
- 環(huán)信內(nèi)部實現(xiàn)了數(shù)據(jù)緩存,會把聊天記錄添加到數(shù)據(jù)庫骡湖,把附件(如音頻文件贱纠,圖片文件)下載到本地,使程序員更多時間是花到用戶即時體驗上
- 環(huán)信內(nèi)部已經(jīng)實現(xiàn)了視頻勺鸦,音頻并巍,圖片,其它附件發(fā)送功能
- 環(huán)信使用公司可以節(jié)約時間成本
- 不需要公司內(nèi)部搭建服務(wù)器
- 客戶端的開發(fā)换途,使用環(huán)信SDK比使用XMPPFramework更簡潔方便