2013-12-11 24 views
0

在我的應用程序中,我需要獲得所有的用戶名OpenFire從OpenFire獲取所有用戶名和XMPP

我用下面的代碼,但它不給零數據。

和我的事情是我的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; 
} 

任何形式的幫助表示讚賞....

+0

你能告訴我哪個XEP擴展有這個節,通過它你試圖獲得所有註冊用戶。 –

+0

我在github的應用程序中包含了大部分內容,但對其不甚瞭解。但哪一個是最需要的,因爲你知道告訴我,那麼我會告訴你,一個是否包含。但我得到** mArray **零。 – Sam

回答

0

通過這個代碼,你可以得到的名單列表(您來自openr fire server的朋友列表)。

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]; 

和響應將與您所期望的相同。

+0

感謝您的回答,但如何從中獲取用戶名?可能是這個問題是愚蠢的,但我是新的,所以打印後不要得到用戶名。你能幫我解決嗎? – Sam

+0

你從OpenFire得到的迴應是什麼? –

+0

在結束sendElement做到這一點,我會得到答覆?意味着我對你的問題是,是否有任何方法來獲得你的代碼的迴應?如果是的話那怎麼樣? – Sam

0

嘗試是這樣的:

[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 

希望這可以幫助:]

0

我有同樣的問題,我得到了queryElement爲零。我已經改變了響應代碼看到這樣的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; 
} 
2

我努力讓所有註冊用戶的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; 
} 

這爲我工作,希望它會爲別人工作,以及... :)

+0

嗨ANY_ID_NAME什麼是我必須在這裏指定的。以及爲什麼要添加屬性名稱 –

+0

@MadBurea ANY_ID_NAME是xml語法的一部分。我們必須照原樣通過。我們添加屬性以指定我們想從公雞獲取哪種類型的用戶。在這裏,我指定了none和兩種類型的用戶。 –

+0

XMPPIQ * iq = [DDXMLElement elementWithName:@「iq」]; 在swift 3中拋出錯誤,因爲您無法將XMPPIQ轉換爲DDXMLElement。 –