iOS XMPP framework get all registered users

爷,独闯天下 提交于 2019-11-27 03:00:12

问题


In my chat application I want to get all online registered users. So everybody and not only people in my roster which is achieved with this code:

- (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"]];
    }
}
}

With this code the users only sees other users who are 'friends' but I need all users registered on this particular domain. Is this possible with ejabberd?


回答1:


- (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];
        }



    }



回答2:


I had the same issue, I got queryElement as nil as well. I've changed the response code to see the XML like this:

- (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; 
}    

As you may see what I've changed is the xmlns: from this xmlns: @"http://jabber.org/protocol/disco#items" to this xmlns: @"jabber:iq:roster" and that gave me the list of users.

I'm using ejabberd, not sure if this works for all the others XMPP servers.

Also I've found that this gave me the list of the "buddy" users, looks like if you want "all" users you need to make the query as an admin user. Please check this link for more information about it: https://www.ejabberd.im/node/3420




回答3:


After googling, You can not get all user easily, You must need to create Shared Roster Groups by follow step in the Example 1: everybody can see everybody else after done this you will get all the online users in the below delegate methods.

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


来源:https://stackoverflow.com/questions/18340905/ios-xmpp-framework-get-all-registered-users

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!