美文网首页iOS
iOS XMPP——企业名册

iOS XMPP——企业名册

作者: iOS_成才录 | 来源:发表于2015-11-12 19:29 被阅读225次

    实现步骤

    • 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 () <NSFetchedResultsControllerDelegate>{
        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<NSFetchedResultsSectionInfo> sectionInfo = _resultsContr.sections[section];
        
        return [sectionInfo numberOfObjects];
    }
    
    
    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
        //获取分组的信息
        id<NSFetchedResultsSectionInfo> 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——企业名册

        本文链接:https://www.haomeiwen.com/subject/sqmchttx.html