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

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

怎么获取群组列表呢?

首先,依然是向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

XMPP系列(七)---获取群组列表的更多相关文章

  1. mssql sqlserver 使用sql脚本获取群组后,按时间排序(asc)第一条数据的方法分享

    摘要: 下文讲述使用sql脚本,获取群组后记录的第一条数据业务场景说明: 学校教务处要求统计: 每次作业,最早提交的学生名单下文通过举例的方式,记录此次脚本编写方法,方便以后备查,如下所示: 实现思路 ...

  2. XMPP系列(六)---创建群组

    最近公司项目需要,要做一个自己的IMSDK,顺便先把之前没有记录的群聊功能记录一下. 先上资料,查看XMPP群聊相关的资料,可以去这里看协议:XEP-0045 . 创建群组 XMPP 框架里有一个类X ...

  3. JBoss 系列十九:使用JGroups构建块RspFilter对群组通信返回消息进行过滤

    内容概述 本部分说明JGroups构建块接口RspFilter,具体提供一个简单示例来说明如何使用JGroups构建块RspFilter对群组通信返回消息进行过滤. 示例描述 我们知道构建块基于通道之 ...

  4. 第七章 手动部署Fisco Bcos 区块链并完成新增群组,在原有群组中新增机构

    鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 目标 1.新增群组搭建完整联盟链 2.根据群组新 ...

  5. C#开发BIMFACE系列7 服务端API之获取文件信息列表

    系列目录     [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ...

  6. C#开发BIMFACE系列17 服务端API之获取模型数据2:获取构件材质列表

    系列目录     [已更新最新开发文章,点击查看详细] 在上一篇<C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表>中介绍了获取单文件(模型)的所有 ...

  7. ASP.NET SignalR 系列(五)之群组推送

    在上一章介绍了 一对一推送的方式,这章重点介绍下群组推送和多人推送 群组主要就是用到了方法:Groups.Add(Context.ConnectionId, groupName); 将不同的连接id加 ...

  8. python 使用wxpy实现获取微信好友列表 头像 群成员

    最近在学习 python 突然想要试试能不能把微信里面的微信群和好友取出来 结果百度了一下 找到了 wxpy 这怎么能不试一下呢 用到 wxpy.threading.os.time 四个库 第一步 判 ...

  9. linux基础-第七单元 用户、群组及权限的深入讨论

    怎样查看文件的权限 ls命令详解 root用户及文件的安全控制 什么是root用户 用户分类 文件操作权限 文件操作权限的字符表示 chown chgrp 使用符号表示法设定文件或目录上的权限 chm ...

随机推荐

  1. 计蒜客NOIP2017提高组模拟赛(三)day2-直线的交点

    传送门 简单几何+逆序对 发现当两条直线甲乙与平板的交点在上面甲在较左的位置,那么下面甲在较右的位置就可以相交 然后把上面的位置排下序,下面离散化+树状数组即可 #include<cstdio& ...

  2. [UOJ UNR #2]积劳成疾

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...

  3. 【The Time Traveller's Wife】

    After reading The Time Traveller's Wife:      It's a tragedy,I think.But it's mixed with hope.Henry ...

  4. Java Servlet 笔记2

    1. Servlet的生命周期 Servlet 通过调用 init () 方法进行初始化. Servlet 调用 service() 方法来处理客户端的请求. Servlet 通过调用 destroy ...

  5. Python中模块之xml的讲解

    xml模块的功能介绍 这里主要讲解xml模块下的etree.ElementTree类. 1. 创建 具体代码如下 import xml.etree.ElementTree as XM namelist ...

  6. java集合之ArrayList源码解读

    源自:jdk1.8.0_121 ArrayList继承自AbstractList,实现了List.RandomAccess.Cloneable.Serializable. ArrayList内部是通过 ...

  7. 利用maven install jar到项目当中

    接着上面利用maven打好的jar包.把刚刚打好的包放入其他项目当中怎么办? 只需要在相同的目录下执行mvn install,maven会自动把jar放到本地仓库中. 这样,原先maven项目中缺少依 ...

  8. Mysql--开篇&目录

    Mysql 现在是互联网公司中使用得非常广泛的数据库产品了,开源.免费.小巧.易用等诸多特性奠定了其夯实的基础.自己从事 JavaWeb 也有一段时间了,工作中也是用的 Mysql,也会涉及到分析.慢 ...

  9. 初识Redis系列之二:安装及简单使用

    仅介绍windows下的安装 一:下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统平台的 ...

  10. Spring Cloud 服务端注册与客户端调用

    Spring Cloud 服务端注册与客户端调用 上一篇中,我们已经把Spring Cloud的服务注册中心Eureka搭建起来了,这一章,我们讲解如何将服务注册到Eureka,以及客户端如何调用服务 ...