本身學習xmpp官方文檔,慢慢整理的筆記,不見得都是正確的,請用選擇性眼光看待,也有問題還沒有解決,持續更新中~~~併發
建立新工程,命名爲XMPPIOS.app
一:導入XMPPFramework學習
將XMPP拖拽到工程中。ui
添加靜態庫spa
並在Build Settings中設置以下3d
此時Run一下,成功,證實導入正確。代理
注意:XMPP使用了ARC,Edit -> Refactor -> convert to Objective-C ARC,轉換。code
頭文件也能夠本身建立,內容是須要import的頭文件,能夠根據本身的需求來肯定。xml
------------------------------------------------可愛的分界線------------------------------------------------------------------blog
二:鏈接和註冊 XEP-0077 XEP-0020
拖拽相應控件到頁面中。
在appdelegate.h中建立相應屬性
.m
這裏建立xmpp的地方比官方的demo少了不少,主要是由於開始使用的時候我的認爲並不用那麼多變量,以後會一點一點添加。
添加建立鏈接方法
建立鏈接成功後,兩個代理方法調用,分別爲
- (void)xmppStreamWillConnect:(XMPPStream *)sender
- (void)xmppStreamDidConnect:(XMPPStream *)sender
此時添加註冊的代碼
若是註冊成功,調用以下代理方法
- (void)xmppStreamDidRegister:(XMPPStream *)sender
如今看看後臺openfire中已經存在註冊的用戶了。
若是沒有註冊成功則調用
- (void)xmppStream:(XMPPStream *)sender didNotRegister:(NSXMLElement *)error
若是發現以下錯誤
<iq xmlns="jabber:client" type="error" to="saas.kanyabao.com/213e75ed"><query xmlns="jabber:iq:register"><username>dawn</username><password>1111</password></query><error code="409" type="cancel"><conflict xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
則是由於當前的用戶已經存在。
而後在- (void)xmppStreamDidRegister:(XMPPStream *)sender
爲當前用戶作認證,若是認證成功,則調用
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
不然調用
- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error
此時,當前用戶已經與後臺openfire鏈接,可是在openfire中,當前用的狀態是未登陸狀態,因此此時,當前用戶發送狀態告知後臺,這樣其餘的用戶才能收到當前用戶的上線通知。
因此,在
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
方法中添加以下代碼
XMPPPresence *presence = [XMPPPresencepresence];
[[self xmppStream] sendElement:presence];
再次run,刷新open fire 發現當前用戶的狀態已是上線了
注意:註冊以前要建立鏈接,不然會報"Please wait until the stream is connected"的錯誤
鏈接或者註冊後須要作一次認證,併發送一個上線的消息,不然後臺和其餘用戶都沒法收到當前用戶的上線消息,後臺openfire中看到的當前用戶是灰色的離線狀態。
註冊以後若是要再次創建鏈接,最好斷開後再建立,不然會報"Attempting to connect while already connected or connecting"的錯誤。