前面在《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
原文地址:http://blog.csdn.net/hanhailong18/article/details/45222667