iOS开发:xmpp中是如何跟服务器进行联系的?

xmpp中是如何跟服务器进行联系的?

第一步:通过各种模块从服务器获取数据。比如电子名片模块,头像模块,花名册模块,消息模块等。

第二步:修改的数据需要同步到服务器,自己定义的方法,当点击保存按钮时就调用如下方法。

#pragma mark 点击按钮进行服务器更新。
-(void)editVCardViewController:(WCEditVCardViewController *)editVc didFinishedSave:(id)sender{
    WCLog(@"完成保存");

    //获取当前电子名片
    XMPPvCardTemp *myVCard = [WCXMPPTool sharedWCXMPPTool].vCard.myvCardTemp;

    //重新设置头像
    myVCard.photo = UIImageJPEGRepresentation(self.avatarImgView.image, 0.75);

    //重新设置myVCard里的属性
    myVCard.nickname = self.nicknameLabel.text;
    myVCard.orgName = self.orgNameLabel.text;

    if (self.departmentLabel.text != nil) {
        myVCard.orgUnits = @[self.departmentLabel.text];
    }

    myVCard.title = self.telLabel.text;
    myVCard.note = self.telLabel.text;

    //解析邮箱
    //myVCard.mailer = self.emailLabel.text;
    if (self.emailLabel.text.length > 0) {
        // 只保存一个邮箱
        myVCard.emailAddresses = @[self.emailLabel.text];
    }

    //把数据保存到服务器
    // 内部实现数据上传是把整个电子名片数据都从新上传了一次,包括图片
    [[WCXMPPTool sharedWCXMPPTool].vCard updateMyvCardTemp:myVCard];

}

第三步:服务器的内容更新后要通知客户端进行刷新。

方法一:不通过服务器,将修改的内容直接显示到客户端。比如电子名片的修改。

方法二:通过服务器,当服务器存储的内容发生改变时,xmpp框架会更新本地的数据库内容,并且xmpp有个代理方法,当服务器内容发生改变就会回调该方法,可以在这个方法里进行操作从数据库重新获取内容,比如花名册和聊天消息的更改。如下:

//获取需要的数据库
-(void)loadUsers2{
    //显示好友数据 (保存XMPPRoster.sqlite文件)

    //1.上下文 关联XMPPRoster.sqlite文件
    NSManagedObjectContext *rosterContext = [WCXMPPTool sharedWCXMPPTool].rosterStorage.mainThreadManagedObjectContext;

    //2.Request 请求查询哪张表
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];

    //设置排序
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
    request.sortDescriptors = @[sort];

    //过滤
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"subscription != %@",@"none"];
    request.predicate = pre;

    //3.执行请求
    //3.1创建结果控制器
    // 数据库查询,如果数据很多,会放在子线程查询
    // 移动客户端的数据库里数据不会很多,所以很多数据库的查询操作都主线程
    _resultsContr = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:rosterContext sectionNameKeyPath:nil cacheName:nil];
    _resultsContr.delegate = self;
    NSError *err = nil;
    //3.2执行
    [_resultsContr performFetch:&err];

    WCLog(@"%@",_resultsContr.fetchedObjects);
}
//获取数据库的内容并显示
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *ID = @"ContactCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    //获取对应的好友
    //XMPPUserCoreDataStorageObject *user = self.users[indexPath.row];
    XMPPUserCoreDataStorageObject *user = _resultsContr.fetchedObjects[indexPath.row];
    //标识用户是否在线
    // 0:在线 1:离开 2:离线
    WCLog(@"%@:在线状态%@",user.displayName,user.sectionNum);
    cell.textLabel.text = user.displayName;
    // 1.通过KVO来监听用户状态的改变
    //[user addObserver:self forKeyPath:@"sectionNum" options:NSKeyValueObservingOptionNew context:nil];

    switch ([user.sectionNum integerValue]) {
        case 0:
            cell.detailTextLabel.text = @"在线";
            break;
        case 1:
            cell.detailTextLabel.text = @"离开";
            break;
        case 2:
            cell.detailTextLabel.text = @"离线";
            break;
        default:
            cell.detailTextLabel.text = @"见鬼了";
            break;
    }

    //显示好友的头像
    if (user.photo) {//默认的情况,不是程序一启动就有头像
        cell.imageView.image = user.photo;
    }else{
        //从服务器获取头像
        NSData *imgData = [[WCXMPPTool sharedWCXMPPTool].avatar photoDataForJID:user.jid];
        cell.imageView.image = [UIImage imageWithData:imgData];
    }

    return cell;

}
#pragma mark -结果控制器的代理
#pragma mark -数据库内容改变调用该方法
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
    WCLog(@"%@",[NSThread currentThread]);
    //刷新表格
    [self.tableView reloadData];

}
时间: 2024-10-12 00:09:24

iOS开发:xmpp中是如何跟服务器进行联系的?的相关文章

ios开发xmpp仿微信即时聊天工具

最近在做一个项目,需要一个即时聊天工具,先打算有第三方环信(http://www.easemob.com),但是最终老板不允许,要自己开发用自己的服务器,哎!如果有需要的可以去看看这个环信,真的不错.进入今天的主题,其实也是大神们开发的,我在这只是把一些细节理一下让大家你能少走一点弯路,需要的资料和源码这里面都有http://pan.baidu.com/s/1nt5esnn. 详细的介绍看这http://blog.csdn.net/kangx6/article/details/7740135,看

iOS开发 Xcode中的Info.plist字段含义

Info.plist用于向iOS提供关于app,bundle或者framework的一些重要信息.它指定了比如一个应用应该怎样启动,它如何被本地化,应用的名称,要显示的图标,还有更多.Info.plist文件实际上是苹果预定义schema的XML文件. 为了构建一个设备相关的健,你在健的后面要加上~iphone或者~ipad. 常用字段: 1.获取版本信息: NSDictionary*infoDic = [[NSBundle mainBundle] infoDictionary]; NSStri

iOS开发UI中懒加载的使用方法

1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载资源,只有在运行当需要一些资源时,再去加载这些资源. 我们知道iOS设备的内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么就有可能会耗尽iOS设备的内存.这些资源例如大量数据,图片,音频等等,所以我们在使用懒加载的时候一定要注意先判断是否已经有了,如果没有那么再去进行实例化 2.使

IOS开发接口中出现"\"的问题

最近在项目开发中,由于后台接口有问题,出现了"\"这样的数据,按照一般开发中JSON数据读取的方式,会无法识别,因为在一般的语言中"\"都是转义,那么问题来了,怎么解决呢? 这个问题 困扰了我好久,首先我们来看一下,用BeJson来识别一下正常的JSON数据: 此时是正常的 JSON数据 ,现在 在数据中加一个“\” 再来看一下: 报错了! 其实 ,你如果用回车测试一下 ,也会有惊喜的: 是不是 也失败了呢? 这个问题,我有一种崩溃的感觉,除了使用第三方库,感觉,其

iOS 开发之向自己公司git服务器提交代码

公司决定要自己搭建git服务器托管代码,今天我准备提交的时候,发现一些问题跟大家分享一下. 首先,如何安装Git到MAC OS X 在进行安装前,要说一下,Git和SVN一样,都需要创建一个服务器的,他们都可以创建自己的版本管理服务器.对于个人和小团队来说,使用托管服务器可能更合适,常见的有Github 和 Bitbucket.这里我介绍下Bitbucket,Github因为没有个人免费仓库使用,代码放上去就是开源的,所以这里我选择Bitbucket.另外,现在Bitbucket的个人仓库相关页

关于iOS开发CLLocation中定位的一些小问题

困扰了我一周的CLLocation定位问题终于解决了,网上的很多关于CLLocation的文章都是iOS 7 的,按照上面的指导,仍然不能够调出定位功能,对于iOS 8 是需要作额外的添加的,废话不多说 1.首先,需要再 infoplist文件中 添加两个键: 1 2     NSLocationWhenInUseUsageDescription  :当app在前台的时候,才可以获取到定位信息     NSLocationAlwaysUsageDescription     :app在前台.后台

iOS开发Xcode中git使用(部分)

##Xcode中git使用 #####本文在此只介绍当新建工程时,没勾选git选项,但在后期开发过程中又需要使用git的解决办法. ***1. 打开终端2. 输入命令> cd /Users/电脑管理者身份/新建工程位置/新建工程名 如: cd /Users/CHEN-JIE/Desktop/CJGit使用 3. 输入命令:git init >这会初始化一个空的源,如果你在Finder里面查看或是输入ls命令,你会看到.git子目录已经被创建. 4.输入命令:git add. >当前目录所

iOS开发-View中frame和bounds区别

开发中调整View的时候的经常会遇到frame和bounds,刚开始看的时候不是很清楚,不过看了一下官方文档,frame是确定视图在父视图中的位置,和本身的大小,bounds确定可以确定子视图在当前视图中的位置,还可以改变View的大小,如果bounds确定大小,那么View的视图优先选择的bounds中的宽高.Center的位置是相对于父坐标系中的定位.苹果官方给了一张图片供参考: 如果还不是很清晰,可以参考一下frame和bounds的中代码: -(CGRect)frame{ return

iOS开发——NSArray中的字典排序

手头上碰到一个项目,需要给数组中的字典中的一个字段排序,想了想,干脆再字典中增加一个字段,用来记录需要排序字段的第一个字符,用它来作为比较的对象,进行排序. - (void)viewDidLoad { [super viewDidLoad]; NSArray *arr = @[@{@"sortKey":@"54"},@{@"sortKey":@"67"},@{@"sortKey":@"78&quo