2013-08-20 44 views
1

在我的聊天应用程序中,我想获得所有在线注册用户。所以大家不仅人在我的名册随同此代码实现:iOS XMPP框架获取所有注册用户

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence { 
// a buddy went offline/online 
NSString *presenceType = [presence type]; // online/offline 
NSString *myUsername = [[sender myJID] user]; 
NSString *presenceFromUser = [[presence from] user]; 
if (![presenceFromUser isEqualToString:myUsername]) { 
    if ([presenceType isEqualToString:@"available"]) { 
     [_chatDelegate newBuddyOnline:[NSString stringWithFormat:@"%@@%@", presenceFromUser, @"chat.denederlandsewateren.nl"]]; 
    } else if ([presenceType isEqualToString:@"unavailable"]) { 
     [_chatDelegate buddyWentOffline:[NSString stringWithFormat:@"%@@%@", presenceFromUser, @"chat.denederlandsewateren.nl"]]; 
    } 
} 
} 

这段代码的用户只能看到谁是“朋友”,但我需要在这个特定域的所有注册用户的其他用户。这可能与ejabberd?

回答

4
- (void)getAllRegisteredUsers { 

    NSError *error = [[NSError alloc] init]; 
    NSXMLElement *query = [[NSXMLElement alloc] initWithXMLString:@"<query xmlns='http://jabber.org/protocol/disco#items' node='all users'/>" 
                  error:&error]; 
    XMPPIQ *iq = [XMPPIQ iqWithType:@"get" 
           to:[XMPPJID jidWithString:@"DOMAIN"] 
          elementID:[xmppStream generateUUID] child:query]; 
    [xmppStream sendElement:iq]; 
} 

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq 
{ 
    NSXMLElement *queryElement = [iq elementForName: @"query" xmlns: @"http://jabber.org/protocol/disco#items"]; 

    if (queryElement) { 
     NSArray *itemElements = [queryElement elementsForName: @"item"]; 
     NSMutableArray *mArray = [[NSMutableArray alloc] init]; 
     for (int i=0; i<[itemElements count]; i++) { 

      NSString *jid=[[[itemElements objectAtIndex:i] attributeForName:@"jid"] stringValue]; 
      [mArray addObject:jid]; 
     } 



    } 
+0

“DOMAIN”是组的JID?你能上传代码吗?我无法获得该组成员的名单。 – Apple

+0

嗨@Mark Molina,你能帮我找到所有的用户吗?我坚持这个问题,上面的答案不适合我。 – brainforked

+0

'queryElements'在'didReceiveIQ:' –

2

我有同样的问题,我得到了queryElementnil为好。我已经改变了响应码看XML像这样:

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq 
{ 
//DDLogVerbose(@"%@: %@ - %@", THIS_FILE, THIS_METHOD, [iq elementID]); 

//NSXMLElement *queryElement = [iq elementForName:@"query" xmlns: @"http://jabber.org/protocol/disco#items"]; 
NSXMLElement *queryElement = [iq elementForName:@"query" xmlns: @"jabber:iq:roster"]; 
NSLog(@"IQ: %@",iq); 
if (queryElement) { 
    NSArray *itemElements = [queryElement elementsForName: @"item"]; 
    NSMutableArray *mArray = [[NSMutableArray alloc] init]; 
    for (int i=0; i<[itemElements count]; i++) { 

     NSString *jid=[[[itemElements objectAtIndex:i] attributeForName:@"jid"] stringValue]; 
     NSLog(@"%@",jid); 
     [mArray addObject:jid]; 
    } 
} 

return NO; 
}  

正如你可以看到我所改变的是从这个xmlns: @"http://jabber.org/protocol/disco#items"xmlns:这个xmlns: @"jabber:iq:roster"这给了我的用户列表。

我使用ejabberd,不知道这是否适用于所有其他XMPP服务器。

此外,我发现这给了我“好友”用户的列表,看起来好像你想让所有用户需要作为管理员用户进行查询。请检查此链接了解更多关于它的信息:https://www.ejabberd.im/node/3420

0

谷歌搜索后,就可以轻松搞定所有的用户,你必须需要通过遵循step in the Example 1: everybody can see everybody else创建共享名册组做到了这一点后,你将得到所有的在线用户下面的委托方法。

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence