XMPP开发之获取好友列表

前面在《XMPP开发之adium客户端登陆》中和大家分享了登录的代码和常遇到的问题。几天和大家分享获取好友列表以及相关的问题。

说到获取好友列表,那么很有必要说一下首先网站上gitHub上给出的demo其实是有点问题的,主要就是coredata的文件,有问题,刚开始一直报错,存取都失败,后来发现了我按照他们原来的字段重新建了一个coredata的文件,另外由于这里只是一个demo所以知识简单的实现了好友从a~z的排序,还有就是分组还没有实现,这个等以后把这一块完善后和大家分享下。

如果要有好友列表,那么必须要有添加好友,和同意好友请求的操作。这两个功能的实现我主要放在了Appdelegate里了,代码如下:

// 处理加好友回调,加好友
- (void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence

{
    //取得好友状态
    NSString *presenceType = [NSString stringWithFormat:@"%@", [presence type]]; //online/offline
    //请求的用户
    NSString *presenceFromUser =[NSString stringWithFormat:@"%@", [[presence from] user]];
    NSLog(@"presenceType:%@",presenceType);

    NSLog(@"presence2:%@  sender2:%@",presence,sender);

    XMPPJID *jid = [XMPPJID jidWithString:presenceFromUser];
    [xmppRoster acceptPresenceSubscriptionRequestFrom:jid andAddToRoster:YES];

}

//再次处理加好友
// 收到好友上下线状态
- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence {
    //    DDLogVerbose(@"%@: %@ ^^^ %@", THIS_FILE, THIS_METHOD, [presence fromStr]);

//    NSLog(@"presence %@",presence);
    //取得好友状态
    NSString *presenceType = [NSString stringWithFormat:@"%@", [presence type]]; //online/offline

    //当前用户
    //    NSString *userId = [NSString stringWithFormat:@"%@", [[sender myJID] user]];
    //在线用户
    NSString *presenceFromUser =[NSString stringWithFormat:@"%@", [[presence from] user]];
    NSLog(@"presenceType:%@",presenceType);
    NSLog(@"用户:%@",presenceFromUser);
    //这里再次加好友
    if ([presenceType isEqualToString:@"subscribe"]) {
        XMPPJID *jid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@",[presence from]]];
        [xmppRoster acceptPresenceSubscriptionRequestFrom:jid andAddToRoster:YES];
    }
}
// 删除好友,取消加好友,或者加好友后需要删除
- (void)removeBuddy:(NSString *)name
{
    XMPPJID *jid = [XMPPJID jidWithString:name];

    [xmppRoster removeUser:jid];
}

如果想要利用coreda来保存好友列表,那么就要在登录成功后执行这些操作:


//认证成功后的回调
-(void)xmppStreamDidAuthenticate:(XMPPStream *)sender
{

    NSLog(@"登陆成功");
    [self goOnline];

    xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
    xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterStorage];
//    xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:xmppRosterStorage dispatchQueue:dispatch_get_main_queue()];

    //自动获取用户列表
    xmppRoster.autoFetchRoster = YES;
    xmppRoster.autoAcceptKnownPresenceSubscriptionRequests = YES;

   [xmppRoster activate:xmppStream];
    xmppRosterManagedObjectContext = xmppRosterStorage.mainThreadManagedObjectContext;
//    friendModel = [[FriendModelClass alloc] init];

    [self queryRoster];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"loginIn" object:nil];

}

这样的话,获取的好友列表就会自动的保存到coredata的数据库中。我们需要的时候只要按照别人封装好的方法获取就行了,很简单的,如果想要实现分组的话,就需要自己花点时间好好弄弄了。

获取好友列表的代码如下:

- (void)getFriendList {

    //获取Roster的上下文
    UIApplication *application = [UIApplication sharedApplication];
    id delegate = [application delegate];
    xmppRosterManagedObjectContext = [delegate xmppRosterManagedObjectContext];

    //从CoreData中获取数据
    //通过实体获取FetchRequest实体
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([XMPPUserCoreDataStorageObject class])];
    //添加排序规则
    NSSortDescriptor * sortD = [NSSortDescriptor sortDescriptorWithKey:@"jidStr" ascending:YES];
    [request setSortDescriptors:@[sortD]];

    //获取FRC
    fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.xmppRosterManagedObjectContext sectionNameKeyPath:nil cacheName:nil];
    fetchedResultsController.delegate = self;

    //获取内容

    NSError * error;
    if (![self.fetchedResultsController performFetch:&error])
    {
        NSLog(@"%s  %@",__FUNCTION__,[error localizedDescription]);
    }

    [mainTableView reloadData];
}

运行效果如下:

大家可以先看下好友列表已经获取到了,下篇博客的活我会和大家分享下文字聊天。

demo下载地址如下:demo

时间: 2024-11-09 07:48:34

XMPP开发之获取好友列表的相关文章

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

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

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

1.心跳检测.掉线重连功能 客户端和服务器端都可以设置多久发送一次心跳包,如果对方没有返回正确的pong信息,则会断开连接,而添加掉线重连功能,则会自动进行连接. 如果自己写聊天功能还得自己做心跳检测和掉线重连,比较麻烦.好在XMPP中已经做了心跳检测和掉线重连的模块,只需要几行代码加进去就能实现掉线重连,非常方便. XMPP中Extensions文件下都是可以自己添加的Module,它们都继承自XMPPModule,而添加的方法也非常的简单: <span style="font-size

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

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

Android 开发 ContentProvider 获取歌曲列表和联系人的样例

ContentProvider(内容提供者)是Android中的四大组件之中的一个. 主要用于对外共享数据.也就是通过ContentProvider把应用中的数据共享给其它应用訪问.其它应用能够通过ContentProvider对指定应用中的数据进行操作.ContentProvider分为系统的和自己定义的,系统的也就是比如联系人,图片等数据. 下面这段是Google Doc中对ContentProvider的大致概述. 内容提供者将一些特定的应用程序数据供给其他应用程序使用. 数据能够存储于文

Android 开发 ContentProvider 获取歌曲列表和联系人的例子

ContentProvider(内容提供者)是Android中的四大组件之一.主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作.ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据. 以下这段是Google Doc中对ContentProvider的大致概述. 内容提供者将一些特定的应用程序数据供给其它应用程序使用.数据可以存储于文件系统.SQ

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

xmpp开发教程(六)-添加和删除好友

这章开发添加和删除好友的模块,首先列出里面主要的方法: 1 [_xmppRoster fetchRoster];//获取好友列表 2 3 //获取到一个好友节点 4 - (void)xmppRoster:(XMPPRoster *)sender didRecieveRosterItem:(NSXMLElement *)item 5 6 //获取完好友列表 7 - (void)xmppRosterDidEndPopulating:(XMPPRoster *)sender 8 9 //到服务器上请求