XMPP协议获取花名册(好友列表)

时间:2022-10-30 17:09:46

首先导入花名册模块,理由同上篇文章,这里不再具体说明

// 花名册模块
#import "XMPPRoster.h"
#import "XMPPRosterCoreDataStorage.h"


初始化花名册模块,并激活
//设置花名册模块
self.rosterStorage=[[XMPPRosterCoreDataStorage alloc]init];
self.roster=[[XMPPRoster alloc]initWithRosterStorage:self.rosterStorage];
[self.roster activate:self.stream];

花名册模块也是先从服务器获取在存到本地数据库,再从本地数据库获取利用CoreData花名册存在XMPPUserCoreDataStorageObject表中,CordData有个很强大的类是

NSFetchedResultsController,他可以监听数据值的变化,如果设置代理了一但变化就会通知代理,这时候当一个用户的在线状态发生变化时刷新表格即可,免得用kvo监听属性比较麻烦<当切换登录用户时会把数据库里的好友数据删除,在把新的当前用户的好友数据加到数据库>

XMPPTool *tool=[XMPPTool sharedXMPPTool];
NSManagedObjectContext *context=tool.rosterStorage.mainThreadManagedObjectContext;
NSFetchRequest *request=[[NSFetchRequest alloc]initWithEntityName:@"XMPPUserCoreDataStorageObject"];
//对结果进行排序
NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
request.sortDescriptors=@[sort];
//设置谓词过滤
NSPredicate *pre=[NSPredicate predicateWithFormat:@"subscription!=%@",@"none"];
request.predicate=pre;//此处是设置过滤,none为加好友请求没有同意的好友
self.resultController=[[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
//设置代理
self.resultController.delegate=self;
NSError *error=nil;
//执行
[self.resultController performFetch:&error];
if (error) {
LSLog(@"出错:%@",error);
}

取出表中每一行数据,即一个好友用户信息,user.photo为nil,所以每个好友头像都得自己利用头像模块获取

XMPPUserCoreDataStorageObject *user=self.resultController.fetchedObjects[indexPath.row];
if (user.photo) {
cell.imageView.image=user.photo;
}else {
XMPPTool *tool=[XMPPTool sharedXMPPTool];
cell.imageView.image= [UIImage imageWithData:[tool.avatar photoDataForJID:user.jid]];

}
cell.textLabel.text=user.nickname;
switch (user.sectionNum.intValue) {
case 0:
cell.detailTextLabel.text=@"在线";
break;

case 1:
cell.detailTextLabel.text=@"离开";
break;
case 2:
cell.detailTextLabel.text=@"离线";
break;

default:
cell.detailTextLabel.text=@"未知";
break;
}


NSFetchedResultsController代理方法实现,数据改变刷新表格

-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView reloadData];
}


删除好友,利用花名册模块删除

        XMPPTool *tool=[XMPPTool sharedXMPPTool];
XMPPUserCoreDataStorageObject *user=self.resultController.fetchedObjects[indexPath.row];
[tool.roster removeUser:user.jid];

加好友,首先利用花名测存储模块判断是否存在当前要添加用户

if (self.contactTextField.text==nil) {
[KVNProgress showErrorWithStatus:@"请输入用户名"];
return;
}
if ([self.contactTextField.text isEqualToString:[LSAccount sharedAccount].loginName]) {
[KVNProgress showErrorWithStatus:@"不能添加自己"];
return;
}
XMPPTool *tool=[XMPPTool sharedXMPPTool];
NSString *user=self.contactTextField.text;
XMPPJID *userJid=[XMPPJID jidWithUser:user domain:[LSAccount sharedAccount].domain resource:@"iPhone6s"];
if ([tool.rosterStorage userExistsWithJID:userJid xmppStream:tool.stream]){
[KVNProgress showErrorWithStatus:@"此好友已经存在"];
}else {//在XMPP里订阅即是添加
[tool.roster subscribePresenceToUser:userJid];
}
/*添加好友在现有openfire存在的问题
1.添加不存在的好友,通讯录里面也现示了好友
解决办法1. 服务器可以拦截好友添加的请求,如当前数据库没有好友,不要返回信息
<presence type="subscribe" to="werqqrwe@127.0.0.1"><x xmlns="vcard-temp:x:update"><photo>b5448c463bc4ea8dae9e0fe65179e1d827c740d0</photo></x></presence>

解决办法2.过滤数据库的Subscription字段查询请求
none 对方没有同意添加好友
to 发给对方的请求
from 别人发来的请求
both 双方互为好友

*/