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

相关文章
相关标签/搜索