【问题标题】:Get Roster List XMPP Framework获取名册列表 XMPP 框架
【发布时间】:2014-07-27 18:00:05
【问题描述】:

以下是我使用的委托方法,即使它被调用,'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

每次好友上线或下线时都会调用。但是需要一份完整的好友名单。

【问题讨论】:

    标签: ios ejabberd xmppframework


    【解决方案1】:

    要获得完整的花名册,您需要发送花名册请求:

    - (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:@"ANY_ID_NAME@weejoob.info"];
        [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;
    }
    

    名册可能包含关系类型(to、none、both、from),根据您的要求,您可以通过上述项目列表的“type”属性选择合适的名册成员。

    【讨论】:

    • 在哪里实现 {- (void)FetchFriends } 方法
    • @CunchalRaj 如何设置这两个。我能够同时获得两个用户但是如何发送订阅有时我没有得到它显示为来自
    • didReceiveIQ 委托方法永远不会被我调用。我完全使用了你的代码,我所做的只是将它翻译成 swift
    【解决方案2】:

    对于 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
        }
    

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 2015-05-24
      • 2013-08-22
      • 2016-01-30
      • 2015-12-25
      • 2015-09-19
      • 2011-05-25
      • 1970-01-01
      相关资源
      最近更新 更多