【问题标题】:Get All Username from OpenFire with XMPP使用 XMPP 从 OpenFire 获取所有用户名
【发布时间】:2013-12-29 04:25:58
【问题描述】:

在我的应用程序中,我需要从 OpenFire 获取 All the UserName

我使用了下面的代码,但它没有给出零数据。

我发现我的 didReceiveIQ 方法出了点问题,但使用的是第一次 XMPP,所以没有遇到实际问题。

我获取数据的代码是

- (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:[NSString stringWithFormat:@"Domain Name with jid"]]
                      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"];

NSLog(@"queryelement %@",queryElement);

if (queryElement) {

    NSLog(@"query in if");
    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];

        NSLog(@"User in OpenFire = %@",jid);

    }

    NSLog(@"mArray = %@",mArray);

}

return NO;
}  

感谢任何形式的帮助....

【问题讨论】:

  • 你能告诉我哪个 XEP 扩展有这个节,你试图通过它来获取所有注册用户。
  • 我从 github 将其大部分包含在我的应用程序中,但对它了解不多。但是您知道哪一个最需要它,请告诉我,然后我会告诉您是否包含其中一个。但我得到 mArray nil.

标签: ios iphone xcode xmpp openfire


【解决方案1】:

我正在努力让所有注册用户从 openfire 进入我的应用程序。我尝试了上述所有方法,但没有帮助我! 在尝试了很多之后,我得到了一个让所有注册用户的解决方案...... 这是代码:

- (void)getAllRegisteredUsers {

    NSError *error = [[NSError alloc] init];
    NSXMLElement *query = [[NSXMLElement alloc] initWithXMLString:@"<query xmlns='jabber:iq:roster'/>" error:&error];
    XMPPIQ *iq = [DDXMLElement elementWithName:@"iq"];
    [iq addAttributeWithName:@"type" stringValue:@"get"];
    [iq addAttributeWithName:@"none" stringValue:@"ANY_ID_NAME"];
    [iq addAttributeWithName:@"both" stringValue:@"ANY_ID_NAME"];
    [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"];
        NSMutableArray *mArray = [[NSMutableArray alloc] init];
        for (int i=0; i<[itemElements count]; i++) {

            NSString *jid=[[[itemElements objectAtIndex:i] attributeForName:@"jid"] stringValue];
            [mArray addObject:jid];
        }
        NSLog(@"%@",mArray);
    }
    return YES;
}

这对我有用,希望对其他人也有用... :)

【讨论】:

  • 嘿什么是 ANY_ID_NAME 我必须在这里指定什么。以及为什么要添加属性名称
  • @MadBurea ANY_ID_NAME 是 xml 语法的一部分。我们必须按原样通过它。我们添加属性来指定我们要从公鸡中获取的用户类型。在这里,我指定了无和两种类型的用户。
  • XMPPIQ *iq = [DDXMLElement elementWithName:@"iq"];这会在 swift 3 中引发错误,因为您无法将 XMPPIQ 转换为 DDXMLElement。
  • @MadBurea 你在使用这个“XMPPIQ *iq = [DDXMLElement elementWithName:@"iq"];” swift中的语法?
  • 没有人 我该如何使用它。它是 var iq: XMPPIQ? = DDXMLElement(名称:“iq”)
【解决方案2】:

通过此代码,您可以获得花名册列表(您来自 openr fire 服务器的好友列表)。

   NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];

   NSXMLElement *iq = [NSXMLElement elementWithName:@"iq"];
   [iq addAttributeWithName:@"type" stringValue:@"get"];
   [iq addChild:query];
   [xmppStream sendElement:iq];

响应将与您的预期相同。

【讨论】:

  • 感谢您的回答,但如何从中获取用户名?可能问题很愚蠢,但我是新手,所以打印后不要得到用户名。你能帮帮我吗?
  • OpenFire 的响应是什么?
  • 最后 sendElement 完成了,我应该在哪里得到响应?意味着我对你的问题是,有什么方法可以让你的代码得到响应吗?如果是,那怎么办?
  • didReceiveIQ方法中,当你发送iq请求时,reponse肯定只会响应iq。
  • 我告诉过它会提供您名册中的用户列表。仅表示您的朋友列表。
【解决方案3】:

试试这样的:

[xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue() ] ;
[xmppRoster fetchRoster ] ;

你应该在获取名册之前初始化XMPPRoster

    xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
//  xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] initWithInMemoryStore];

xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterStorage];

XMPPRoster 对象上发送fetchRoster 后,您可以从 XMPPRosterDelegate的方法:

- (void)xmppRoster:(XMPPRoster *)sender didReceiveRosterItem:(NSXMLElement *)item 

希望这能有所帮助:]

【讨论】:

    【解决方案4】:

    我有同样的问题,我也得到了 queryElement 为 nil。我更改了响应代码以查看如下所示的 XML:

    - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
    {
        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; 
    } 
    

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 1970-01-01
      • 2014-03-20
      • 2013-10-21
      • 2016-03-03
      • 2019-01-23
      • 2016-07-28
      • 2014-11-06
      • 2015-03-03
      相关资源
      最近更新 更多