Получить список участников XMPP Framework

Ниже приведен метод делегата, который я использовал, и даже несмотря на то, что он вызывается, 'queryElement' присваивается значение nil. Хотя у вошедшего в систему пользователя много контактов.

-(BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{
   NSXMLElement *queryElement = [iq elementForName: @"query" xmlns: @"jabber:iq:roster"];
   NSMutableArray *ArrayUsers = [[NSMutableArray alloc]init];
   if (queryElement) 
   {
       NSArray *itemElements = [queryElement elementsForName: @"item"];
       [ArrayUsers removeAllObjects];
       for (int i=0; i<[itemElements count]; i++) 
       {
           NSString *jid=[[[itemElements objectAtIndex:i] attributeForName:@"jid"] stringValue];
           [ArrayUsers addObject:jid];
       }
   }
   NSLog(@"users: %@",ArrayUsers);
   return NO;

}

Любой, кто мог бы помочь получить список приятелей (как онлайн, так и офлайн)?

Метод XMPPFramework:

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

вызывается каждый раз, когда приятель подключается к сети или выходит из сети. Но нужен полный список друзей.


person Chanchal Raj    schedule 06.06.2014    source источник


Ответы (2)


Чтобы получить полный список участников, вам необходимо отправить запрос на ростеры:

- (void)FetchFriends 
{
    NSError *error = [[NSError alloc] init];
    NSXMLElement *query = [[NSXMLElement alloc] initWithXMLString:@"<query xmlns='jabber:iq:roster'/>"error:&error];
    NSXMLElement *iq = [NSXMLElement elementWithName:@"iq"];

    [iq addAttributeWithName:@"type" stringValue:@"get"];
    [iq addAttributeWithName:@"id" stringValue:@"ANY_ID_NAME"];
    [iq addAttributeWithName:@"from" stringValue:@"[email protected]"];
    [iq addChild:query];

    [xmppStream sendElement:iq];
}

Сервер отвечает на запрос, и ответ обрабатывается следующим методом делегата:

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{
    NSXMLElement *queryElement = [iq elementForName: @"query" xmlns: @"jabber:iq:roster"];
    if (queryElement) 
    {
        NSArray *itemElements = [queryElement elementsForName: @"item"];
        for (int i=0; i<[itemElements count]; i++)
        {
            NSLog(@"Friend: %@",[[itemElements[i] attributeForName:@"jid"]stringValue]);
        }
    }
    return NO;
}

Списки могут содержать тип отношений (к, ни один, оба, от), исходя из ваших требований, вы можете выбрать подходящих членов списка по атрибуту «тип» в приведенном выше списке элементов.

person Chanchal Raj    schedule 11.06.2014
comment
где реализовать метод {- (void)FetchFriends} - person Bhavin Ramani; 18.07.2015
comment
@ChanchalRaj, как установить это оба. Я могу получить обоих пользователей, но как отправить подписку несколько раз, я не получаю оба, которые отображаются как с - person Bittoo; 01.06.2016
comment
метод делегата didReceiveIQ никогда не вызывается для меня. Я использовал именно ваш код, единственное, что я сделал, это перевел его на быстрый - person NoSixties; 18.06.2017

Для Swift 5:

func fetchFreind(){
        let query = try? DDXMLElement(xmlString:"<query xmlns='jabber:iq:roster'/>")
        let iq =  DDXMLElement(name: "iq")
        iq.addAttribute(withName:"type" , stringValue: "get")
        iq.addAttribute(withName:"id" , stringValue: "ANY_ID_NAME")
        iq.addAttribute(withName:"from" , stringValue: "ANY_ID_NAME@aaa")
        iq.addChild(query!)
        xmppStream.send(iq)
    }

И вы получите список:

 func xmppStream(_ sender: XMPPStream!, didReceive iq: XMPPIQ!) -> Bool {
        let queryElement = iq.elements(forName:"query")
        if queryElement.count > 0{
            let itemElement = queryElement[0].elements(forName: "item")
            for item in itemElement{
                print("User JID :- \(String(describing: item.attribute(forName: "jid")!))")
            }
        }
        return false
    }
person nimesh surani    schedule 13.12.2019