一、简介
-
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];
}