XMPPFramework - 如何接收名册的在线信息以及名单列表?

时间:2014-06-13 16:19:41

标签: ios objective-c xmpp xmppframework

需要帮助获取有关好友的状态信息的信息。

我正在调用“fetchRoster”函数,但是我获取了名单列表,但没有显示状态信息。

此外,我尝试显式调用显示的状态信息。但是在我的iOS应用中没有调用didRecievePresence委托。

此致 Cbhat

1 个答案:

答案 0 :(得分:7)

From Robbiehanson's XMPPFramework - RootViewController class:

  1. 获取你的名册

    - (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;
    }
    
  2. 只要在服务器中记录用户状态的变化

    ,就重新加载您的表格
    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
    {
        [[self tableView] reloadData];
    }
    
  3. 显示头像(个人资料图片)

    - (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"];
        }
    }
    
  4. 将表分为两部分 - 可用/离线

    - (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 @"";
    }
    
  5. 使用用户的显示名称显示整个名单

    - (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;
    }
    
  6. 这包含在您下载的XMPPFramework中。试验它。我说的这5点可能就是你所需要的。