IOS XMPP的實踐


  近期一網友說一起研究XMPP協議,然后就花了點時間 研究了研究,其實也談不上研究XMPP協議,就是簡單的在IOS平台上使用而已。不過一切都得從使用開始,然后才能深入研究。

  關於XMPP的介紹,我找了些資料

簡介:http://www.cnblogs.com/cokecoffe/archive/2012/08/19/2646245.html

實現:http://www.cnblogs.com/cokecoffe/archive/2012/08/19/2646280.html

比較具體的:http://wiki.jabbercn.org/index.php?title=RFC3920&variant=zh-cn

 


  

至於在IOS上的應用,參考了國外這個教程:

http://mobile.tutsplus.com/tutorials/iphone/building-a-jabber-client-for-ios-interface-setup/

從從服務器搭建,到客戶端實現,一共有四個步驟。服務器搭建基本沒有什么大問題,細心一點,關鍵是剩下的三步。

教程使用的xmpp framework不是最新的,所以如果你現在從Github上下載最新的XMPP Framework的話,應該是會出不少問題。

比如就說導入框架的時候,教程簡單的說把幾個文件夾托進去就可以。但是等實際操作的時候,會發現,這么做的話會引起很多編譯報錯。

所以呢,最好按照https://github.com/cokecoffe/XMPPFramework說明里的

Getting started using XMPPFramework on iOS

一步步來導入Framework,記住每做一步都要編譯一下驗證是否沒有編譯報錯,要不等把所有框架都加進去后,再編譯,到時候錯誤很難查出,我就在這上面浪費了不少時間。

 

剩下就是客戶端的創建了。先大概了解下程序的框架,主要是有三個界面,一個登陸,一個好友列表,一個聊天界面。

程序與服務器交互,我們把協議實現在AppDelegate里,這樣方便在任何類中調用。

看圖吧:

關鍵部分就是XMPPDelegate協議的實現部分,簡單的列舉一下要使用到的方法:

 1 1.關於連接的  2 //此方法在stream開始連接服務器的時候調用
 3 - (void)xmppStreamDidConnect:(XMPPStream *)sender
 4 //此方法在stream連接斷開的時候調用
 5 - (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error;

6 2.關於驗證的 7 //驗證失敗后調用 8 - (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error 9 //驗證成功后調用 10 - (void)xmppStreamDidAuthenticate:(XMPPStream *)sender

11 3.關於通信的 12 //收到消息后調用 13 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message 14 //接受到好友狀態更新 15 - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence

 


 

之后就是具體去實現了。我在實現過程遇到了各種問題,雖然不大,但是很不好解決。因為資料甚少。

下面是我遇到的幾個問題:

1.在收到消息后,

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message

會被調用,然后就是解析message,提取消息的類型、內容等信息。

按教程來,等好友發送消息過來的時候,提取body的時候,會發現會掛掉。打印出message沒有body一項。

這是因為好友的聊天輸入框激活的時候就會給我們發送消息,這個時候的消息里沒有body一項,所以[message elementForName:@"body"]返回nil,然后我又把nil添加到了NSDictionary里,所以掛掉了。

后來看官方的Demo里,有這樣一個方法[message isChatMessageWithBody],方法作用正如其名。

所以在轉發消息之前,先判斷下,就ok。

 

2.教程里的好友頁面,-(void)viewDidAppear:(BOOL)animated方法里會調用connect。

也就是每次好友頁面出現都會connect。這里雖然不會導致程序crash掉,但是stream會重復建立,有可能消息會收不到。

所以我在connect方法里加以判斷,如果stream!=nil,直接return。

 

3.這個問題就比較詭異了,我發現我只要給好友發送消息,對方就顯示我已經下線了。

找了許久,就查發送消息那塊,死活沒問題啊。一個星期后,偶然看起來好友列表里顯示的好友地址不對,原來,好友名和域名少了個@符號。

結果導致了這詭異的問題。真是粗心。

 


 

基本上就總結了這些,因為我寫再多也不如自己親身實驗,所以大家多多實驗,遇到問題可以交流。本人比較在乎文章產生的影響,不希望誤導別人,也不希望被人誤導。所以大家如果讀到此文章,要慎重閱讀,並且敢於提出質疑。如果這里有什么不妥的地方,歡迎指出。

國內也有幾個教程,基本也是參考上面提到的那個國外的教程。大同小異,寫的也不錯,可以參考。

http://blog.csdn.net/kangkangz4/article/details/7740135

 XMPP Framework 框架下載 https://github.com/cokecoffe/XMPPFramework


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM