Фреймворк 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?


person Mark Molina    schedule 20.08.2013    source источник


Ответы (3)


У меня была такая же проблема, я тоже получил 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

person Simon    schedule 19.01.2015

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

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
person iPatel    schedule 23.08.2016

person    schedule
comment
ДОМЕН - это JID группы ?? не могли бы вы загрузить код. Не могу получить список участников группы. - person Apple; 02.12.2013
comment
Привет @Mark Molina, не могли бы вы помочь мне со всеми пользователями. Я застрял с этой проблемой, и приведенный выше ответ не работает для меня. - person brainforked; 27.05.2014
comment
queryElements возвращает nil в didReceiveIQ: - person Nirav Dangi; 08.10.2014
comment
У кого-нибудь есть решение для этого? Приведенный выше код у меня не работает - person Rafeeq; 07.07.2015
comment
@Mark, приведенный выше код у меня не работает. Моя строфа IQ: ‹iq type=get ​​to=dove.cebod.com id=B0E0C5C3-F186-4651-8CAB-B48A73DBDEA0›‹query xmlns=jabber.org/protocol/disco#items node=all users›‹/query›‹/iq›, но я получил код ошибки 403. Что могло быть упущено в строфе IQ? - person Jekil Patel; 20.06.2018