環(huán)信(XMPP)

一睦刃、即時通訊

什么是即時通訊不瓶?

  • 即時通訊棚放,又稱實時通訊
  • 即時通信(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)信占用市場份額較大
各類IM服務(wù)占比例圖的變化.png

集成環(huán)信的前提準(zhǔn)備

 /*
*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)}];```

![登錄.png](http://upload-images.jianshu.io/upload_images/1429890-e6764e24a534832b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 注冊

[[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];
}```
![Snip20160421_6.png](http://upload-images.jianshu.io/upload_images/1429890-19ee9e81764f398c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 當(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更簡潔方便
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懊渡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子军拟,更是在濱河造成了極大的恐慌剃执,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懈息,死亡現(xiàn)場離奇詭異肾档,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門怒见,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俗慈,“玉大人,你說我怎么就攤上這事遣耍」脍澹” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵舵变,是天一觀的道長酣溃。 經(jīng)常有香客問我,道長纪隙,這世上最難降的妖魔是什么赊豌? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮绵咱,結(jié)果婚禮上碘饼,老公的妹妹穿的比我還像新娘。我一直安慰自己悲伶,他們只是感情好派昧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拢切,像睡著了一般蒂萎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淮椰,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天五慈,我揣著相機(jī)與錄音,去河邊找鬼主穗。 笑死泻拦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忽媒。 我是一名探鬼主播争拐,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晦雨!你這毒婦竟也來了架曹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闹瞧,失蹤者是張志新(化名)和其女友劉穎绑雄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奥邮,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡万牺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年罗珍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脚粟。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡覆旱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出核无,到底是詐尸還是另有隱情通殃,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布厕宗,位于F島的核電站,受9級特大地震影響堕担,放射性物質(zhì)發(fā)生泄漏已慢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一霹购、第九天 我趴在偏房一處隱蔽的房頂上張望佑惠。 院中可真熱鬧,春花似錦齐疙、人聲如沸膜楷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赌厅。三九已至,卻和暖如春轿塔,著一層夾襖步出監(jiān)牢的瞬間特愿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工勾缭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揍障,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓俩由,卻偏偏與公主長得像毒嫡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子幻梯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容