XMPP系列(三)---获取好友列表、加入好友
1、心跳检測、掉线重连功能
client和server端都能够设置多久发送一次心跳包,假设对方没有返回正确的pong信息,则会断开连接,而加入掉线重连功能,则会自己主动进行连接。
假设自己写聊天功能还得自己做心跳检測和掉线重连,比較麻烦。好在XMPP中已经做了心跳检測和掉线重连的模块,仅仅须要几行代码加进去就能实现掉线重连,很方便。
XMPP中Extensions文件下都是能够自己加入的Module,它们都继承自XMPPModule。而加入的方法也很的简单:
<span style="font-size:18px;">//加入功能模块
//1.autoPing 发送的时一个stream:ping 对方假设想表示自己是活跃的。应该返回一个pong
_xmppAutoPing = [[XMPPAutoPing alloc] init];
//全部的Module模块。都要激活active
[_xmppAutoPing activate:self.xmppStream]; //autoPing因为他回定时发送ping,要求对方返回pong,因此这个时间我们须要设置
[_xmppAutoPing setPingInterval:1000];
//不不过server来得响应;假设是普通的用户,一样会响应
[_xmppAutoPing setRespondsToQueries:YES];
//这个过程是C---->S ;观察 S--->C(须要在server设置) //2.autoReconnect 自己主动重连,当我们被断开了,自己主动又一次连接上去,而且将上一次的信息自己主动加上去
_xmppReconnect = [[XMPPReconnect alloc] init];
[_xmppReconnect activate:self.xmppStream];
[_xmppReconnect setAutoReconnect:YES];</span>
2.获取好友列表
获取好友列表和好友操作都须要用到好友模块。首先加入好友模块:
// 3.好友模块 支持我们管理、同步、申请、删除好友
_xmppRosterMemoryStorage = [[XMPPRosterMemoryStorage alloc] init];
_xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:_xmppRosterMemoryStorage];
[_xmppRoster activate:self.xmppStream]; //同一时候给_xmppRosterMemoryStorage 和 _xmppRoster都加入了代理
[_xmppRoster addDelegate:self delegateQueue:dispatch_get_main_queue()];
//设置好友同步策略,XMPP一旦连接成功。同步好友到本地
[_xmppRoster setAutoFetchRoster:YES]; //自己主动同步,从server取出好友
//关掉自己主动接收好友请求。默认开启自己主动允许
[_xmppRoster setAutoAcceptKnownPresenceSubscriptionRequests:NO];
然后实现好友同步的代理方法:
/**
* 同步结束
**/
//收到好友列表IQ会进入的方法,而且已经存入我的存储器
- (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:kXMPP_ROSTER_CHANGE object:nil];
}
然后在好友列表控制取出好友数据
#pragma mark - notification event
- (void)rosterChange
{
//从存储器中取出我得好友数组。更新数据源
self.contacts = [NSMutableArray arrayWithArray:[JKXMPPTool sharedInstance].xmppRosterMemoryStorage.unsortedUsers];
[self.tableView reloadData]; }
关于好友列表界面的cell:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"contactCell" forIndexPath:indexPath];
XMPPUserMemoryStorageObject *user = self.contacts[indexPath.row];
UILabel *nameLabel = (UILabel *)[cell viewWithTag:1001];
nameLabel.text = user.jid.user;
UILabel *statusLabel = (UILabel *)[cell viewWithTag:1002];
if ([user isOnline]) {
statusLabel.text = @"[在线]";
statusLabel.textColor = [UIColor blackColor];
nameLabel.textColor = [UIColor blackColor];
} else {
statusLabel.text = @"[离线]";
statusLabel.textColor = [UIColor grayColor];
nameLabel.textColor = [UIColor grayColor];
}
return cell;
}
3、加入好友功能
首先在JKXMPPTool中加入一个方法:
- (void)addFriend:(XMPPJID *)aJID
{
//这里的nickname是我对它的备注。并不是他得个人资料中得nickname
[self.xmppRoster addUser:aJID withNickname:@"好友"];
}
然后实现好友模块代理方法:
// 假设不是初始化同步来的roster,那么会自己主动存入我的好友存储器
- (void)xmppRosterDidChange:(XMPPRosterMemoryStorage *)sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:kXMPP_ROSTER_CHANGE object:nil];
}
收到好友请求时的处理:
/** 收到出席订阅请求(代表对方想加入自己为好友) */
- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence
{
NSLog(@"didReceivePresenceSubscriptionRequest");
//加入好友一定会订阅对方,可是接受订阅不一定要加入对方为好友
self.receivePresence = presence; NSString *message = [NSString stringWithFormat:@"【%@】想加你为好友",presence.from.bare];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:message delegate:self cancelButtonTitle:@"拒绝" otherButtonTitles:@"允许", nil];
[alertView show]; //允许并加入对方为好友
// [self.xmppRoster acceptPresenceSubscriptionRequestFrom:presence.from andAddToRoster:YES];
//拒绝的方法
// [self.xmppRoster rejectPresenceSubscriptionRequestFrom:presence.from];
} - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
{
//收到对方取消定阅我得消息
if ([presence.type isEqualToString:@"unsubscribe"]) {
//从我的本地通讯录中将他移除
[self.xmppRoster removeUser:presence.from];
}
}
XMPP系列(三)---获取好友列表、加入好友的更多相关文章
- XMPP系列(三)---获取好友列表、添加好友
1.心跳检测.掉线重连功能 客户端和服务器端都可以设置多久发送一次心跳包,如果对方没有返回正确的pong信息,则会断开连接,而添加掉线重连功能,则会自动进行连接. 如果自己写聊天功能还得自己做心跳检测 ...
- Python基础笔记系列三:list列表
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python中的list列表是一种序列型数据类型,一有序数据集合用逗号间隔 ...
- Eureka系列(三)获取服务Client端具体实现
获取服务Client 端流程 我们先看下面这张图片,这张图片简单描述了下我们Client是如何获取到Server已续约实例信息的流程: 从图片中我们可以知晓大致流程就是Client会自己开启一个 ...
- UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天
这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 #pragma mark - ...
- XMPP框架下微信项目总结(5)花名册获取(好友列表)
---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...
- 一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)
× 本篇主要是: 获取好友列表,群列表 我会尽量详细一点,尽我所知的分享一些可能大家已经掌握的或者还不清楚的经验 利于大家阅读,文章样式不再复杂化,根据内容取固定色 目前总进度大概65% 全系列预计会 ...
- XMPP通讯开发-仿QQ显示好友列表和用户组
在 XMPP通讯开发-服务器好友获取以及监听状态变化 中我们获取服务器上的用户好友信息,然后结合XMPP通讯开发-好友获取界面设计 我们将两个合并起来,首先获取用户组,然后把用户组用List ...
- 【iOS XMPP】使用XMPPFramewok(五):好友列表
转自:http://www.cnblogs.com/dyingbleed/archive/2013/05/17/3082226.html 好友列表 好友列表,在 XMPP 中被称为 roster,花名 ...
- python 使用wxpy实现获取微信好友列表 头像 群成员
最近在学习 python 突然想要试试能不能把微信里面的微信群和好友取出来 结果百度了一下 找到了 wxpy 这怎么能不试一下呢 用到 wxpy.threading.os.time 四个库 第一步 判 ...
随机推荐
- python获取目录下文件夹名称
path = '/opt' dirs = os.listdir(path) for dir in dirs: print dir
- vscode设置背景图片
最近在知乎上看见有人设置了vscode编辑器的背景图片,觉得很新鲜,就尝试以一下,倒是成功了. 1.首先在vscode扩展中,找到background这个插件,快捷键Ctrl+shift+x 2.完成 ...
- js常用方法 备用
/* function obj$(id) 根据id得到对象 function val$(id) 根据id得到对象的值 ...
- 00深入理解C指针之--- 指针之外
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. C语言从诞生之初就非常善于和硬件打交道,经过这么多年的发展之后,其灵活性和超强的特征是 ...
- 记Django数据库迁移过程中遇到的一些问题
首先描述一下问题,Django 数据库使用的mysql, 然后开始没注意,没建一个default库,就把第一个数据库当成默认的了,结果Django的admin相关的那些表,都自动生成到这个库里了,现在 ...
- 只用一次循环开销 将类似 1 A 、1 B 的数据返回成为 1 A,B 的拼接形式
/// <summary> ///将类似 1 A .1 B 的数据返回成为 1 A,B 的拼接形式 /// </summary> /// <param name=&quo ...
- 洛谷 P1426 小鱼会有危险吗【模拟/题意理解】
题目描述 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是 ...
- Codeforces 371B Fox Dividing Cheese(简单数论)
题目链接 Fox Dividing Cheese 思路:求出两个数a和b的最大公约数g,然后求出a/g,b/g,分别记为c和d. 然后考虑c和d,若c或d中存在不为2,3,5的质因子,则直接输出-1( ...
- log4j(一)
一.基础知识 Log4j有三个重要组件:Logger-日志信息的级别,appenders-日志信息的输出目的地,layouts-日志信息的输出格式. Logger-日志信息的级别:level 是日志记 ...
- Linux内核Crash分析
转载自:http://linux.cn/article-3475-1.html 在工作中经常会遇到一些内核crash的情况,本文就是根据内核出现crash后的打印信息,对其进行了分析,使用的内核版本为 ...