iOS XMPP——企业名册

实现步骤

  • 1、在XMPPFrame.h文件中打开花名册模块
// 花名册模块
#import "XMPPRoster.h"
#import "XMPPRosterCoreDataStorage.h"
  • 2、在AppDelegate.m中加入以下属性:
// 花名册模块
@property (nonatomic, strong,readonly)XMPPRoster *roster;

// 花名册数据存储
@property (nonatomic, strong,readonly)XMPPRosterCoreDataStorage *rosterStorage;
  • 3、修改AppDelegate.m文件中的setupXmppStream方法,添加花名册模块:
#pragma mark 初始化xmppStrem对象
-(void)setupXmppStream{
    
    NSAssert(_xmppStream == nil, @"xmppStream对象初始化多次");
    
    //1.创建xmppStrem对象
    _xmppStream = [[XMPPStream alloc] init];
    //2.添加代表
    [_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
    
    //3.添加自动连接模块
    _reconnect = [[XMPPReconnect alloc] init];
    //激活
    [_reconnect activate:_xmppStream];
    
    // 电子名片数据存储
    _vCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
    //4.添加电子名片模块
    _vCardModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:_vCardStorage];
    //激活
    [_vCardModule activate:_xmppStream];
    
    //5.添加头像模块
    _vCardAvatar = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:_vCardModule];
    [_vCardAvatar activate:_xmppStream];

    // 6. 添加花名册模块
    _rosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
    _roster = [[XMPPRoster alloc] initWithRosterStorage:_rosterStorage];
    [_roster activate:_xmppStream];
}
  • 4、修改AppDelegate.m文件中,释放资源
#pragma mark 释放资源
-(void)teardownXmppstream{
    // 移动代理
    [_xmppStream removeDelegate:self];
    
    //停止模块
    //停止自动连接模块
    [_reconnect deactivate];
    
    // 停止电子名片模块
    [_vCardModule deactivate];
    
    // 停止头像模块
    [_vCardAvatar deactivate];
    
    // 停止花名册模块
    [_roster deactivate];
    
    //断开连接
    [_xmppStream disconnect];
    
    //清空资源为nil
    _xmppStream = nil;
    _reconnect = nil;
    _vCardModule = nil;
    _vCardStorage = nil;
    _vCardAvatar = nil;
    _roster = nil;
    _rosterStorage = nil;
}

展示企业名册 到 JPRosterViewController控制器视图中

  • 1、查询所有的好友列表
#import "JPRosterViewController.h"
#import "JPAppDelegate.h"

@interface JPRosterViewController () {
    NSFetchedResultsController *_resultsContr;
}

@property (nonatomic, strong) NSArray *friends;
@end

@implementation JPRosterViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //从数据库获取好友列表
    //1.拿上下文
    NSManagedObjectContext *rosterContext = xmppDelegate.rosterStorage.mainThreadManagedObjectContext;
    
    //2.创建查询对象
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];
    
    //3.设置排序
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
    request.sortDescriptors = @[sort];
    
    
    //第一种方法查询数据
    //4.执行请求
//    NSError *error = nil;
//    self.friends = [rosterContext executeFetchRequest:request error:&error];
//   JPLogInfo(@"%@",self.friends);
//    if (error) {
//        JPLogInfo(@"%@",error);
//    }
//    
    //第二种方法查询数据
//    _resultsContr = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:rosterContext sectionNameKeyPath:nil cacheName:nil];

    //sectionNum是在线状态 根据在线状态进行分组查询
    _resultsContr = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:rosterContext sectionNameKeyPath:@"sectionNum" cacheName:nil];
    
    //执行查询
    NSError *error = nil;
    [_resultsContr performFetch:&error];
    if (error) {
        NSLog(@"%@",error);
    }
    
    //设置代理
    _resultsContr.delegate = self;
    
    NSArray *mFriends = [_resultsContr fetchedObjects];
    NSLog(@"%@=",mFriends);
}
@end
  • 2、将数据展示到控制器的表格中,实现数据源方法,这里:按照好友的状态来进行分组实现,如下:
#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
    // Return the number of sections.
    //分组数据
    return _resultsContr.sections.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.
    // Return the number of rows in the section.
    //return [_resultsContr fetchedObjects].count;
    
    //获取分组的信息
    id sectionInfo = _resultsContr.sections[section];
    
    return [sectionInfo numberOfObjects];
}


-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    //获取分组的信息
    id sectionInfo = _resultsContr.sections[section];
    
    //indexTitle就是分组字段(sectionNum)的值
    CZLogInfo(@"%@",[sectionInfo indexTitle]);
    NSString *title = nil;
    int state = [[sectionInfo indexTitle] intValue];
    switch (state) {
        case 0:
            title = @"在线";
            break;
        case 1:
            title = @"离开";
            break;
            
        case 2:
            title  = @"离线";
            break;
        default:
            title = @"未知状态";
            break;
    }
    
    return title;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *ID = @"FriendCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    // Configure the cell...
//    XMPPUserCoreDataStorageObject *friend = self.friends[indexPath.row];
    //获取对应的好友
    //XMPPUserCoreDataStorageObject *friend = [_resultsContr fetchedObjects][indexPath.row];
    
    
    //获取分组后的好友信息
    XMPPUserCoreDataStorageObject *friend = [_resultsContr objectAtIndexPath:indexPath];
    cell.textLabel.text = friend.displayName;
    
    return cell;
}

删除好友功能的实现

  • 1.我们可以遵守NSFetchedResultsControllerDelegate协议,让控制器成为 _resultsContr.delegate = self;然后实现协议的方法,就可以监听到好友数据的改变了
//删除好友
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        
        //获取好友
        XMPPUserCoreDataStorageObject *friend = [_resultsContr objectAtIndexPath:indexPath];
        
        [xmppDelegate.roster removeUser:friend.jid];
    }
    
}

#pragma mark NSFetchedResultsController的代理
/**
 *  查询好友的数据改变会调用这个方法(比如,删除好友,添加好友)
 *
 *  @param controller <#controller description#>
 */
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
    CZLogInfo(@"controllerDidChangeContent");
    
    [self.tableView reloadData];
}

添加好友

#import "JPAddRosterViewController.h"
#import "JPAppDelegate.h"

@interface JPAddRosterViewController ()
- (IBAction)addFriend;
@property (weak, nonatomic) IBOutlet UITextField *jidField;

@end

@implementation JPAddRosterViewController

- (IBAction)addFriend {

    //获取域名
    NSString *domain = xmppDelegate.xmppStream.hostName;
    
    NSString *jid = self.jidField.text;
    
    JPLogInfo(@"添加好友 %@",jid);
    //获取jid有没有域名(@teacher.local)
    NSString *rangeStr = [NSString stringWithFormat:@"@%@",domain];
   
    NSRange range = [jid rangeOfString:rangeStr];
    //如果没有域名,自己添加完整的jid
    if (range.location == NSNotFound) {
        jid = [jid stringByAppendingString:rangeStr];
    }
    
    XMPPJID *friendJid = [XMPPJID jidWithString:jid];
    
    //有可能好友已经存在,不须要添加
    BOOL exists = [xmppDelegate.rosterStorage userExistsWithJID:friendJid xmppStream:xmppDelegate.xmppStream];
    
    //用户已经存在
    if (exists) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"当前添加的好友已经存在,无须添加" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles:nil, nil];
        [alert show];
        
        return;
    }
    
    //好友添加
    JPLogInfo(@"%@",jid);
    
    [xmppDelegate.roster subscribePresenceToUser:friendJid];
    
    //销毁控制器
    [self.navigationController popViewControllerAnimated:YES];
}
@end

你可能感兴趣的:(iOS XMPP——企业名册)