1、心跳检测、掉线重连功能

客户端和服务器端都可以设置多久发送一次心跳包,如果对方没有返回正确的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];
//不仅仅是服务器来得响应;如果是普通的用户,一样会响应
[_xmppAutoPing setRespondsToQueries:YES];
//这个过程是C---->S ;观察 S--->C(需要在服务器设置) //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]; //自动同步,从服务器取出好友
//关掉自动接收好友请求,默认开启自动同意
[_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];
}
}

demo地址:https://github.com/Joker-King/ChatDemo

XMPP系列(三)---获取好友列表、添加好友的更多相关文章

  1. XMPP系列(三)---获取好友列表、加入好友

    1.心跳检測.掉线重连功能 client和server端都能够设置多久发送一次心跳包,假设对方没有返回正确的pong信息,则会断开连接,而加入掉线重连功能,则会自己主动进行连接. 假设自己写聊天功能还 ...

  2. XMPP框架下微信项目总结(5)花名册获取(好友列表)

    ---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...

  3. 一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)

    × 本篇主要是: 获取好友列表,群列表 我会尽量详细一点,尽我所知的分享一些可能大家已经掌握的或者还不清楚的经验 利于大家阅读,文章样式不再复杂化,根据内容取固定色 目前总进度大概65% 全系列预计会 ...

  4. web qq 获取好友列表hash算法

    web qq 获取好友列表hash算法 在使用web qq的接口进行好友列表获取的时候,需要post一个参数:hash 在对其js文件进行分析之后,发现计算hash的函数位于: http://0.we ...

  5. Python基础笔记系列三:list列表

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python中的list列表是一种序列型数据类型,一有序数据集合用逗号间隔 ...

  6. 开源微信Http协议Sdk【实现登录/获取好友列表/修改备注/发送消息】

    基于微信Http协议封装的一个Sdk,目前实现了以下功能:. 1:扫码登录(检测二维码扫描状态) 2:获取最近联系人.群组.所有联系人 3:修改好友备注 4:给好友发送消息 暂且这么多,也没多余的时间 ...

  7. Eureka系列(三)获取服务Client端具体实现

    获取服务Client 端流程   我们先看下面这张图片,这张图片简单描述了下我们Client是如何获取到Server已续约实例信息的流程:  从图片中我们可以知晓大致流程就是Client会自己开启一个 ...

  8. UI进阶 即时通讯之XMPP好友列表、添加好友、获取会话内容、简单聊天

    这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 #pragma mark - ...

  9. XMPP通讯开发-仿QQ显示好友列表和用户组

    在 XMPP通讯开发-服务器好友获取以及监听状态变化   中我们获取服务器上的用户好友信息,然后结合XMPP通讯开发-好友获取界面设计    我们将两个合并起来,首先获取用户组,然后把用户组用List ...

随机推荐

  1. RxJava(九)zip操作符在Android中的实际使用场景

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51614927 本文出自:[余志强的博客] 一.zip操作符概述 官方 ...

  2. linux源码编译安装OpenCV

    为了尽可能保证OpenCV的特性,使用OpenCV源码编译安装在linux上.先从安装其依赖项开始,以ubuntu 14.04.X为例讲解在Linux上源码编译安装OpenCV,其他linux版本可以 ...

  3. iOS 10 推送全解析,注意事项

    本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacode 使用 iOS ...

  4. [ExtJS5学习笔记]第二十节 Extjs5配合数组的push方法,动态创建并加载组件

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39226773 官方例子:http://docs.sencha.com/extjs/5. ...

  5. RecyclerView下拉刷新上拉加载(三)—对Adapter的封装

    RecyclerView下拉刷新上拉加载(一) http://blog.csdn.net/baiyuliang2013/article/details/51506036 RecyclerView下拉刷 ...

  6. TortoiseSVN服务器ip地址修改后如何使用

    TortoiseSVN是很多人特别是程序员经常使用的工作追述工具,在长期使用过程中难免会遇到服务器迁移ip地址变更的问题.那么在服务器ip地址变化之后,我们要如何继续使用呢?步骤其实非常简单,下面我们 ...

  7. Sql Server服务远程过程调用失败

    由于开发系统,需要vs版本统一,于是经过了昨天一整天艰苦卓绝的斗争,小编终于成功的写在了13版本的vs,重新装上了12版本的vs,本来想着,12版本的vs搭建成功了,就赶快搭建框架,然后敲例子,可是天 ...

  8. 【一天一道LeetCode】#165. Compare Version Numbers

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源: htt ...

  9. 使用JavaScript在Canvas上画出一片星空

    随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...

  10. OC可点击的两种轮播图效果

    基本上,每一个APP都有一个轮播图的效果展示,一般都是用来展示图片的一些信息,然后可以点击查看或购买,所以在此我将这种轮播图进行了一个类的封装,效果包含两种形式:第一种,来回轮转样式,第二种,一个方向 ...