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 () <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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,376评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,118评论 29 470
  • 潍坊回临沂路上下了大雨,没吃午饭,和陈老师一起在车站超市买了零食。 金锣火腿肠最便宜那一款,红色肠衣包装。 依稀记...
    你的猴子呢阅读 334评论 0 2
  • 梦里梦外皆沉醉,一许温柔绕指肠。 独醒方知心中想,半是痴缠半是殇。 ...
    言西十日阅读 100评论 0 0