自己學習xmpp官方文檔,慢慢整理的筆記,不見得都是正確的,請用選擇性眼光看待,也有問題尚未解決,持續更新中~~~
創建新工程,命名為XMPPIOS.
一:導入XMPPFramework
將XMPP拖拽到工程中。
添加靜態庫
並在Build Settings中設置如下
此時Run一下,成功,證明導入正確。
注意:XMPP使用了ARC,Edit -> Refactor -> convert to Objective-C ARC,轉換。
頭文件也可以自己創建,內容是需要import的頭文件,可以根據自己的需求來確定。
------------------------------------------------可愛的分界線------------------------------------------------------------------
二:連接和注冊 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"的錯誤。