XMPP系列(三)---获取好友列表、添加好友

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 23:58:43

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

XMPP开发之获取好友列表

前面在<XMPP开发之adium客户端登陆>中和大家分享了登录的代码和常遇到的问题.几天和大家分享获取好友列表以及相关的问题. 说到获取好友列表,那么很有必要说一下首先网站上gitHub上给出的demo其实是有点问题的,主要就是coredata的文件,有问题,刚开始一直报错,存取都失败,后来发现了我按照他们原来的字段重新建了一个coredata的文件,另外由于这里只是一个demo所以知识简单的实现了好友从a~z的排序,还有就是分组还没有实现,这个等以后把这一块完善后和大家分享下. 如果要有好友

xmpp开发教程(四)-获取好友列表

这章节主要是介绍如何获取好友列表,在这里主要是做功能部分,后续更新的时候就将界面也做上去 首先提供下核心代码 1 xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init]; 2 // xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] initWithInMemoryStore]; 3 4 xmppRoster = [[XMPPRoster alloc] initWithRo

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

× 本篇主要是: 获取好友列表,群列表 我会尽量详细一点,尽我所知的分享一些可能大家已经掌握的或者还不清楚的经验 利于大家阅读,文章样式不再复杂化,根据内容取固定色 目前总进度大概65% 全系列预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*?∀?*) 获取好友 1-获取QQ好友的hash算法 P = function (b, j) { for (var a = j + "password error&qu

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

这篇博客的代码是直接在上篇博客的基础上增加的,先给出部分代码,最后会给出能实现简单功能的完整代码. UI进阶 即时通讯之XMPP登录.注册 1.好友列表 初始化好友花名册 1 #pragma mark - 管理好友 2 // 获取管理好友的单例对象 3 XMPPRosterCoreDataStorage *rosterStorage = [XMPPRosterCoreDataStorage sharedInstance]; 4 // 用管理好友的单例对象初始化Roster花名册 5 // 好友操

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

1.好友列表 初始化好友花名册 1 #pragma mark - 管理好友 2 // 获取管理好友的单例对象 3 XMPPRosterCoreDataStorage *rosterStorage = [XMPPRosterCoreDataStorage sharedInstance]; 4 // 用管理好友的单例对象初始化Roster花名册 5 // 好友操作是耗时操作 6 self.xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:r

xmpp获取好友信息和添加删除好友(4)

原始地址: XMPPFrameWork IOS 开发(五)获取好友信息和添加删除好友 好友列表和好友名片 [cpp] view plaincopyprint? [_xmppRoster fetchRoster];//获取好友列表 //获取到一个好友节点 - (void)xmppRoster:(XMPPRoster *)sender didRecieveRosterItem:(NSXMLElement *)item //获取完好友列表 - (void)xmppRosterDidEndPopulat

阿里百川IIMSDK-- 加好友,获取好友

加好友, 其实就是跟发消息一样 获取好友列表 同步好友列表 SDK内部默认会在每次登陆成功后与服务端同步好友列表,开发者可以通过设置disableAutoRequestAllContacts来禁用这个特性,也可以通过 1 - (void)requestAllContactsFromServerWithResultBlock:(YWContactsOperationResultBlock)resultBlock; 来主动发起同步请求. 怎么调用呢? 获取本地好友 开发者可以通过 1 2 3 4 5

xmpp-iOS-获取好友列表、聊天信息列表、聊天

typedef enum {//发送消息类型的枚举 text, image, audio } MsgType; #import "XMPPData.h" #import "XMPPFramework.h" @interface XMPPData()<XMPPStreamDelegate,XMPPRosterDelegate,NSFetchedResultsControllerDelegate> @property(strong,nonatomic) XM

即时通讯技术 好友列表实现

在IM通讯中,通常需要管理自己的小伙伴,经常联系的,重要的用户需要标识在同一用户列表里,方便自己快速联系以及查看好友动态.那么如何可以做到类似QQ的好友列表功能呢,下面以一款在市面上功能强大的SDK为例做功能实现说明. BRAChat SDK(-Chat音视频互动开发平台)是一套跨平台的(*)即时通讯解决方案,基于先进的H.264视频编码标准.AAC音频编码标准与P2P技术,支持高清视频,整合了佰锐科技在音视频编码.多媒体通讯领域领先的开发技术和丰富的产品经验而设计的高质量.宽适应性.分布式.模