好友列表
好友列表,在 XMPP 中被稱為 roster,花名冊?
獲取 roster 需要客戶端發送 <iq /> 標簽向 XMPP 服務器端查詢
一個 IQ 請求:
<iq type="get"
from="xiaoming@example.com"
to="example.com"
id="1234567">
<query xmlns="jabber:iq:roster"/>
<iq />
type 屬性,說明了該 iq 的類型為 get,與 HTTP 類似,向服務器端請求信息
from 屬性,消息來源,這里是你的 JID
to 屬性,消息目標,這里是服務器域名
id 屬性,標記該請求 ID,當服務器處理完畢請求 get 類型的 iq 后,響應的 result 類型 iq 的 ID 與 請求 iq 的 ID 相同
<query xmlns="jabber:iq:roster"/> 子標簽,說明了客戶端需要查詢 roster
- (void)queryRoster { NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"]; NSXMLElement *iq = [NSXMLElement elementWithName:@"iq"]; XMPPJID *myJID = self.xmppStream.myJID; [iq addAttributeWithName:@"from" stringValue:myJID.description]; [iq addAttributeWithName:@"to" stringValue:myJID.domain]; [iq addAttributeWithName:@"id" stringValue:[self generateID]]; [iq addAttributeWithName:@"type" stringValue:@"get"]; [iq addChild:query]; [self.xmppStream sendElement:iq]; }
一個 IQ 響應:
<iq type="result"
id="1234567"
to="xiaoming@example.com">
<query xmlns="jabber:iq:roster">
<item jid="xiaoyan@example.com" name="小燕" />
<item jid="xiaoqiang@example.com" name="小強"/>
<query />
<iq />
type 屬性,說明了該 iq 的類型為 result,查詢的結果
<query xmlns="jabber:iq:roster"/> 標簽的子標簽 <item />,為查詢的子項,即為 roster
item 標簽的屬性,包含好友的 JID,和其它可選的屬性,例如昵稱等。
通過實現
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq;
方法
當接收到 <iq /> 標簽的內容時,XMPPFramework 框架回調該方法
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq { if ([@"result" isEqualToString:iq.type]) { NSXMLElement *query = iq.childElement; if ([@"query" isEqualToString:query.name]) { NSArray *items = [query children]; for (NSXMLElement *item in items) { NSString *jid = [item attributeStringValueForName:@"jid"]; XMPPJID *xmppJID = [XMPPJID jidWithString:jid]; [self.roster addObject:xmppJID]; } } } }