iOS XMPP framework получат все зарегистрированные пользователи

В моем приложении чата я хочу получить всех онлайн зарегистрированных пользователей. Так что все, а не только люди в моем списке, что достигается с помощью этого кода:

- (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?

3 ответа

Решение
- (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];
        }



    }

У меня была такая же проблема, я получил queryElement как nil также. Я изменил код ответа, чтобы увидеть 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: из этого xmlns: @"http://jabber.org/protocol/disco#items" к этому xmlns: @"jabber:iq:roster" и это дало мне список пользователей.

Я использую ejabberd, не уверен, что это работает для всех других серверов XMPP.

Также я обнаружил, что это дало мне список "приятелей" пользователей, похоже, если вы хотите "всех" пользователей, вам нужно сделать запрос от имени администратора. Пожалуйста, проверьте эту ссылку для получения дополнительной информации об этом: https://www.ejabberd.im/node/3420

После поиска в Google, Вы не можете легко получить доступ ко всем пользователям. Вам необходимо создать Shared Roster Groups, выполнив шаг в Примере 1: все могут видеть всех остальных, после того, как вы это сделаете, вы получите всех онлайн-пользователей в нижеуказанных методах делегирования.

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
Другие вопросы по тегам