iOS XMPP——电子名片 与 头像模块

一、简介

  • vCard(或称做Versitcard),vCard的常用文件扩展名是.vcf
  • vCard是电子名片的文件格式标准,一般附加在电子邮件之后,但也可以用于其它场合(如在因特网上相互交换)

二、实现分析

  • 1.XEP-0054提供了一种机制,可以通过XMPP发送电子名片
  • 2.要使用个人名片首先需要在XMPPFramework.h中启用电子名片与头像模块的扩展头文件:
 // 电子名片
 #import "XMPPvCardCoreDataStorage.h"
 #import"XMPPvCardTempModule.h"

 // 头像模块
 #import "XMPPvCardAvatarModule.h"
  • 3.定义属性及成员变量
  • 4.为XMPPSteam添加电子名片扩展
  • 5.在需要时使用电子名片

三、实现具体步骤

  • 1、在XMPPFramework框架的XMPPFramework.h头文件中,启动电子名片扩展头文件,加入下列代码:

    // 电子名片模块
    #import "XMPPvCardTempModule.h"
    #import "XMPPvCardCoreDataStorage.h"
    
  • 2、定义电子名片属性及成员变量

    • 在AppDelegate.h文件中,加入 全局电子名片模块属性:下列代码,

// 全局电子名片模块
@property (nonatomic, strong,readonly) XMPPvCardTempModule *vCardModule;

   -  在AppDelegate.m文件中,添加如下,电子名片数据存储模块成员变量

  ```objc
 @interface JPAppDelegate()<XMPPStreamDelegate>{
       
  // 自动连接模块
   XMPPReconnect *_reconnect;

 // 电子名片数据存储
  XMPPvCardCoreDataStorage *_vCardStorage;

  // 头像模块
  XMPPvCardAvatarModule *_vCardAvatar;
    
    XMPPResultBlock _resultBlock;
}
  • 3、为XMPPSteam添加电子名片扩展和头像扩展
    • 修改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];
}
  • 4、需要我们手动释放资源
#pragma mark 释放资源
-(void)teardownXmppstream{
    // 移动代理
    [_xmppStream removeDelegate:self];
    
    // 停止模块
    // 停止自动连接模块
    [_reconnect deactivate];
    
    // 停止电子名片模块
    [_vCardModule deactivate];

   // 停止头像模块
    [_vCardAvatar deactivate];    
    
   // 断开连接
    [_xmppStream disconnect];
    
    // 清空资源为nil
    _xmppStream = nil;
    _reconnect = nil;
    _vCardModule = nil;
    _vCardStorage = nil;
   _vCardAvatar = nil;
}
  • 注意:初次运行会自动生成一个SQLite数据库文件:XMPPvCard.sqlite

四、展示电子名片

  • 1、创建JPVCardViewController控制器,并导入头文件
#import "JPAppDelegate.h"
#import "XMPPvCardTemp.h"
  • 2、加载电子名片数据到视图中
@interface JPVCardViewController ()
- (IBAction)logout:(id)sender;
@property (weak, nonatomic) IBOutlet UIImageView *avatar;
@property (weak, nonatomic) IBOutlet UILabel *nickNameLabel;//昵称
@property (weak, nonatomic) IBOutlet UILabel *jidLabel;//jid(用户id)

@property (weak, nonatomic) IBOutlet UILabel *orgNameLabel;//公司名称
@property (weak, nonatomic) IBOutlet UILabel *orgUnitLabel;//公司部门
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;//公司职位
@property (weak, nonatomic) IBOutlet UILabel *telLabel;//电话
@property (weak, nonatomic) IBOutlet UILabel *emailLabel;//邮箱

@end
-(void)viewDidLoad{
    [super viewDidLoad];
   
    [self dataBind];
}


// 电子名片数据绑定
-(void)dataBind{
    
    //初始化登录用户的电子名片信息
    XMPPvCardTemp *myCard = xmppDelegate.vCardModule.myvCardTemp;
    
    if (myCard.photo) {
        NSLog(@"有头像");
        //设置头像
        self.avatar.image = [UIImage imageWithData:myCard.photo];
    }
    
    //设置昵称
    self.nickNameLabel.text = myCard.nickname;
    
    //设置jid
    self.jidLabel.text = xmppDelegate.xmppStream.myJID.bare;
    
    //设置公司
    self.orgNameLabel.text = myCard.orgName;
    
    //设置部门
    if (myCard.orgUnits.count > 0) {
        self.orgUnitLabel.text = myCard.orgUnits[0];
    }
    
    //设置职位
    self.titleLabel.text = myCard.title;
    
    //设置电话 (随便用一个字段充当电话号码)
    self.telLabel.text = myCard.note;
    
    //设置邮件 (随便用一个字段充当邮件)
    self.emailLabel.text = myCard.mailer;
    
    //myCard.jid没有正确返回当用户的jid
    //NSLog(@"jid:%@",myCard.jid.bare);
    
//    NSLog(@"%@ %@ %@ %@ %@ %@ %@", myCard.nickname, myCard.formattedName, myCard.familyName, myCard.givenName, myCard.middleName, myCard.prefix, myCard.suffix);
//    // jid 为空
//    NSLog(@"%@ %@ %@ %@ %@ %@ %@ %@", myCard.addresses, myCard.labels, myCard.telecomsAddresses, myCard.emailAddresses, myCard.jid, myCard.mailer, myCard.timeZone, myCard.location);
//    // 职务,[], 公司,部门数组
//    NSLog(@"%@ %@ %@ %@ %@ %@ %@ %@ %@", myCard.title, myCard.role, myCard.orgName, myCard.orgUnits[0], myCard.categories, myCard.note, myCard.prodid, myCard.sortString, myCard.phoneticSound);
//    NSLog(@"%@ %@ %@ %@ %@", myCard.uid, myCard.url, myCard.version, myCard.description, myCard.keyType);
}

五、修改电子名片

  • 获取到之前的电子名片模型,进行修改,修改之后,要记得更新到服务器上。
-(void)editVCardViewControllerFinish{
    // 把新的电子名片数据上传到服务
    // 1. 获取以前的电子名片数据
    XMPPvCardTemp *myCard = xmppDelegate.vCardModule.myvCardTemp;
    
    // 设置头像
    
    NSData *avatarData = UIImageJPEGRepresentation(self.avatar.image, 0.7);
    if (avatarData) {
        myCard.photo = avatarData;
    }

    // 昵称
    myCard.nickname = self.nickNameLabel.text;
    
    // 公司
    myCard.orgName = self.orgNameLabel.text;
    
    // 部门是一个数组
    NSString *orgUnit = self.orgUnitLabel.text;
    if (orgUnit.length > 0) {
        myCard.orgUnits = @[orgUnit];
    }
    
    // 职位
    myCard.title = self.titleLabel.text;
    
    // 电话
    myCard.note = self.telLabel.text;
    
    // 邮件
    myCard.mailer = self.emailLabel.text;
    
    // 保存数据
    // 先存储到本地,接着上传到服务器
    [xmppDelegate.vCardModule updateMyvCardTemp:myCard];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容