XMPPFramework - 如何接收名册的存在信息以及名册列表?
Posted
技术标签:
【中文标题】XMPPFramework - 如何接收名册的存在信息以及名册列表?【英文标题】:XMPPFramework - How to receive the presence info of a roster along with roster list? 【发布时间】:2014-06-13 16:19:40 【问题描述】:在获取好友的在线信息时需要帮助。
我正在调用“fetchRoster”函数,但是我得到的是名册列表,而不是存在信息。
我还尝试显式调用存在信息。但是在我的 ios 应用程序中没有调用 didRecievePresence 委托。
问候, 呸呸呸
【问题讨论】:
您的问题缺少很多信息。我们无法猜测您的方法是什么样的以及您的代码是如何工作的。请提供您认为相关的代码。 Emilie,我正在开发一个聊天应用程序。为此,我正在使用 XMPPFramework [github.com/robbiehanson/XMPPFramework]。当我调用 [XMPPRoster fetchRoster] 时,我能够获取我的好友列表。但是现在我想检索他们的(状态信息->)个人资料图片、状态信息和昵称信息。这些信息不会随 fetch roster call 一起提供。所以我想知道如何获取好友的存在信息。 【参考方案1】:From Robbiehanson's XMPPFramework - RootViewController class:
获取你的花名册
- (NSFetchedResultsController *)fetchedResultsController
if (fetchedResultsController == nil)
NSManagedObjectContext *moc = [[self appDelegate] managedObjectContext_roster];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject"
inManagedObjectContext:moc];
NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES];
NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, sd2, nil];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setFetchBatchSize:10];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:moc
sectionNameKeyPath:@"sectionNum"
cacheName:nil];
[fetchedResultsController setDelegate:self];
NSError *error = nil;
if (![fetchedResultsController performFetch:&error])
DDLogError(@"Error performing fetch: %@", error);
return fetchedResultsController;
只要服务器中记录了用户存在的变化,就重新加载您的表
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
[[self tableView] reloadData];
显示头像(头像)
- (void)configurePhotoForCell:(UITableViewCell *)cell user:(XMPPUserCoreDataStorageObject *)user
// Our xmppRosterStorage will cache photos as they arrive from the xmppvCardAvatarModule.
// We only need to ask the avatar module for a photo, if the roster doesn't have it.
if (user.photo != nil)
cell.imageView.image = user.photo;
else
NSData *photoData = [[[self appDelegate] xmppvCardAvatarModule] photoDataForJID:user.jid];
if (photoData != nil)
cell.imageView.image = [UIImage imageWithData:photoData];
else
cell.imageView.image = [UIImage imageNamed:@"defaultPerson"];
将表格分为两部分 - 可用/离线
- (NSString *)tableView:(UITableView *)sender titleForHeaderInSection:(NSInteger)sectionIndex
NSArray *sections = [[self fetchedResultsController] sections];
if (sectionIndex < [sections count])
id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:sectionIndex];
int section = [sectionInfo.name intValue];
switch (section)
case 0 : return @"Available";
case 1 : return @"Away";
default : return @"Offline";
return @"";
使用用户的显示名称显示您的整个花名册
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
XMPPUserCoreDataStorageObject *user = [[self fetchedResultsController] objectAtIndexPath:indexPath];
cell.textLabel.text = user.displayName;
[self configurePhotoForCell:cell user:user];
return cell;
这包含在您下载的 XMPPFramework 中。尝试一下。我所说的这 5 点可能就是你所需要的。
【讨论】:
它正在返回用户 nil 的资源。你有什么解决办法吗?以上是关于XMPPFramework - 如何接收名册的存在信息以及名册列表?的主要内容,如果未能解决你的问题,请参考以下文章