IOS XMPP framework get all registered users

In my chat application, I want to get all registered online users. So, everyone and not just the people on my list that are reached 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, users see only other users who are β€œfriends,” but I need all the users registered in this domain. Is this possible with ejabberd?

+2
source share
3 answers
 - (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]; } } 
+4
source

I had the same problem, I got queryElement as nil . I changed the response code to see the XML as follows:

 - (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 can see what I changed, this is xmlns: from this xmlns: @"http://jabber.org/protocol/disco#items" to this xmlns: @"jabber:iq:roster" and it gave me a list users.

I am using ejabberd, not sure if this works for all other XMPP servers.

I also found that this gave me a list of "buddy" users, it seems if you want all the "users" you had to make an administrator request. For more information see this link: https://www.ejabberd.im/node/3420

+2
source

After searching on Google, you can’t easily find the user, you need to create Common registry groups , following the step in Example 1: everyone can see everyone else , after that you will get all online users in the delegate methods listed below.

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

Source: https://habr.com/ru/post/1502847/


All Articles