zoukankan      html  css  js  c++  java
  • XMPP系列(七)---获取群组列表

    上一篇介绍了如何创建群组,这一篇就介绍一下,如何获取自己的群组列表。

    在上一篇有提到,如果我们创建的群组是公共的群组,那么获取自己的群组列表时,会获取到自己的群组列表和那些公共的群组。而实际做社交的应用,一般都不会有公共的群组,这样就可以保证获取到的群组都是自己加入的群组啦。

    怎么获取群组列表呢?

    首先,依然是向openfire 服务器发送一个IQ消息。

    关于服务的结构为什么是这样(也就是to的值),在上一篇文章中有详细的讲解。
    这是示例代码:

    - (void)loadRooms
    {
        NSXMLElement *queryElement= [NSXMLElement elementWithName:@"query" xmlns:@"http://jabber.org/protocol/disco#items"];
        NSXMLElement *iqElement = [NSXMLElement elementWithName:@"iq"];
        [iqElement addAttributeWithName:@"type" stringValue:@"get"];
        [iqElement addAttributeWithName:@"from" stringValue:[JKXMPPTool sharedInstance].xmppStream.myJID.bare];
        NSString *service = [NSString stringWithFormat:@"%@.%@",kXMPP_SUBDOMAIN,kXMPP_DOMAIN];
        [iqElement addAttributeWithName:@"to" stringValue:service];
        [iqElement addAttributeWithName:@"id" stringValue:@"getMyRooms"];
        [iqElement addChild:queryElement];
        [[JKXMPPTool sharedInstance].xmppStream sendElement:iqElement];
    }

    上面,这里设置这个IQ消息的id 为getMyRooms,是为了后面获取返回结果时判断,当然也可以设置别的值。

    然后,在XMPPStream 的代理方法中就可以获取到Openfire 返回的群组列表数据啦。结果会通过- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq返回,但是该代理方法会经常被调用,因此我们需要判断哪些消息是这个IQ请求的结果。

    先看获取群组列表,返回的IQ结果:

    <iq xmlns="jabber:client" type="result" id="getMyRooms" from="group.im.joker.cn" to="1021@im.joker.cn/iOS">
      <query xmlns="http://jabber.org/protocol/disco#items">
        <item jid="20160907135015@group.im.joker.cn" name="20160907135015"/>
        <item jid="20160907150320@group.im.joker.cn" name="20160907150320"/>
      </query>
    </iq>

    看到这个结果,我们可以看出,判断是否是获取群组的结果,可以利用id 来判断,也可以利用query 的xmlns 的值来判断。

    下面是我的处理示例代码:

    - (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
    {
        NSLog(@"iq:%@",iq);
        // 以下两个判断其实只需要有一个就够了
        // 这是判断方式1
        NSString *elementID = iq.elementID;
        if (![elementID isEqualToString:@"getMyRooms"]) {
            return YES;
        }
        // 这是判断方式2
        NSArray *results = [iq elementsForXmlns:@"http://jabber.org/protocol/disco#items"];
        if (results.count < 1) {
            return YES;
        }
    
        NSMutableArray *array = [NSMutableArray array];
        for (DDXMLElement *element in iq.children) {
            if ([element.name isEqualToString:@"query"]) {
                for (DDXMLElement *item in element.children) {
                    if ([item.name isEqualToString:@"item"]) {
                        [array addObject:item];          //array  就是你的群列表
    
                    }
                }
            }
        }
        [[NSNotificationCenter defaultCenter] postNotificationName:kXMPP_GET_GROUPS object:array];
    
        return YES;
    }

    然后就可以利用tableView 来展示群组列表啦。

    Demo地址:ChatDemo

  • 相关阅读:
    [转] linux中 参数命令 -- 和
    ECharts 报表事件联动系列一:刷新页面
    Echarts 简单报表系列三:饼状图
    Echarts 简单报表系列二:折线图
    Echarts 简单报表系列一:柱状图
    Golang 在 Mac、Linux、Windows 下如何交叉编译(转)
    Spring Boot 打war包并利用docBase指定根目录为打包的工程
    JdbcTemplate查询返回JavaBean的几种方法
    Spring JdbcTemplate 查询结果集Map反向生成Java实体(转)
    Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的?(转)
  • 原文地址:https://www.cnblogs.com/wanghang/p/6298838.html
Copyright © 2011-2022 走看看