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
XMPP系列(七)---获取群组列表的更多相关文章
- mssql sqlserver 使用sql脚本获取群组后,按时间排序(asc)第一条数据的方法分享
摘要: 下文讲述使用sql脚本,获取群组后记录的第一条数据业务场景说明: 学校教务处要求统计: 每次作业,最早提交的学生名单下文通过举例的方式,记录此次脚本编写方法,方便以后备查,如下所示: 实现思路 ...
- XMPP系列(六)---创建群组
最近公司项目需要,要做一个自己的IMSDK,顺便先把之前没有记录的群聊功能记录一下. 先上资料,查看XMPP群聊相关的资料,可以去这里看协议:XEP-0045 . 创建群组 XMPP 框架里有一个类X ...
- JBoss 系列十九:使用JGroups构建块RspFilter对群组通信返回消息进行过滤
内容概述 本部分说明JGroups构建块接口RspFilter,具体提供一个简单示例来说明如何使用JGroups构建块RspFilter对群组通信返回消息进行过滤. 示例描述 我们知道构建块基于通道之 ...
- 第七章 手动部署Fisco Bcos 区块链并完成新增群组,在原有群组中新增机构
鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 目标 1.新增群组搭建完整联盟链 2.根据群组新 ...
- C#开发BIMFACE系列7 服务端API之获取文件信息列表
系列目录 [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ...
- C#开发BIMFACE系列17 服务端API之获取模型数据2:获取构件材质列表
系列目录 [已更新最新开发文章,点击查看详细] 在上一篇<C#开发BIMFACE系列16 服务端API之获取模型数据1:查询满足条件的构件ID列表>中介绍了获取单文件(模型)的所有 ...
- ASP.NET SignalR 系列(五)之群组推送
在上一章介绍了 一对一推送的方式,这章重点介绍下群组推送和多人推送 群组主要就是用到了方法:Groups.Add(Context.ConnectionId, groupName); 将不同的连接id加 ...
- python 使用wxpy实现获取微信好友列表 头像 群成员
最近在学习 python 突然想要试试能不能把微信里面的微信群和好友取出来 结果百度了一下 找到了 wxpy 这怎么能不试一下呢 用到 wxpy.threading.os.time 四个库 第一步 判 ...
- linux基础-第七单元 用户、群组及权限的深入讨论
怎样查看文件的权限 ls命令详解 root用户及文件的安全控制 什么是root用户 用户分类 文件操作权限 文件操作权限的字符表示 chown chgrp 使用符号表示法设定文件或目录上的权限 chm ...
随机推荐
- codeforces round #419 A. Karen and Morning
Karen is getting ready for a new school day! It is currently hh:mm, given in a 24-hour format. As yo ...
- ●BZOJ 2007 NOI 2010 海拔
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2007 题解: 网络流.最小割.对偶图 奇妙的题 ~ 种种原因导致了高度要么为 0,要么为 1 ...
- 【Aho-Corasick automation 大米饼模板】
自动机要打熟.自动机要打好.自动机要打得美妙. [例子:HDU2222] #include<stdio.h> #include<queue> #include<cstri ...
- hzoj 2301(莫比乌斯反演)
题意 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公 数. 思路: 与先前的那个相比,这次a,c并不一定 ...
- [BZOJ]1003 物流运输(ZJOI2006)
挖坑,日常划水. 从BZOJ上的AC人数来看这题确实不难,但做这种题的常见思路让小C决定还是mark一下. Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才 ...
- [3.19FJ四校联考]
来自FallDream的博客.未经允许,请勿转载,谢谢. ---------------------------------------------------- A.积分,不会 以后补 B.给定一 ...
- SparkSQL——用之惜之
SparkSql作为Spark的结构化数据处理模块,提供了非常强大的API,让分析人员用一次,就会为之倾倒,为之着迷,为之至死不渝.在内部,SparkSQL使用额外结构信息来执行额外的优化.在外部,可 ...
- WiFi认证中HTTPS重定向
问题描述 在引入WiFiDog实现上网认证功能中,有2个绕不过的问题:https重定向和Select检测问题,前者非要求用户访问80端口,后者导致效率较低下.就用户体验来说,https无法主动重定向非 ...
- c# txt文件的读取和写入
我们在工程实践中经常要处理传感器采集的数据,有时候要把这些数据记录下来,有时候也需要把记录下来的数据读取到项目中.接下来我们用C#演示如何对txt文件进行读写操作.我们要用到StreamReader ...
- 移动端手势双击(MouseDown也可以在移动端响应,但是帧率太低)
void Update() { if (Input.touchCount > 0)//手指数量 { if(Input.GetTouch(0).phase == TouchPhase.Began ...