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 - 如何接收名册的存在信息以及名册列表?的主要内容,如果未能解决你的问题,请参考以下文章

xmpp 框架 - 检测更改的花名册列表

XMPP 框架:无法接收我的消息

如何找到不在名册中的用户的存在?

XMPP名册存在

如何从 xmppframework 的 didReceive IQ 方法中检索图像?

iOS XMPP 从不接收任何好友/名册请求