一、簡介
-
vCard
(或稱做Versitcard),vCard的常用文件擴(kuò)展名是.vcf
-
vCard是電子名片的文件格式標(biāo)準(zhǔn)
胰坟,一般附加在電子郵件之后,但也可以用于其它場合(如在因特網(wǎng)上相互交換)
二泞辐、實(shí)現(xiàn)分析
- 1.XEP-0054提供了一種機(jī)制腕铸,可以通過XMPP發(fā)送電子名片
- 2.要使用個(gè)人名片首先需要在XMPPFramework.h中啟用電子名片與頭像模塊的擴(kuò)展頭文件:
// 電子名片
#import "XMPPvCardCoreDataStorage.h"
#import"XMPPvCardTempModule.h"
// 頭像模塊
#import "XMPPvCardAvatarModule.h"
- 3.定義屬性及成員變量
- 4.為XMPPSteam添加電子名片擴(kuò)展
- 5.在需要時(shí)使用電子名片
三惜犀、實(shí)現(xiàn)具體步驟
-
1、在XMPPFramework框架的XMPPFramework.h頭文件中狠裹,啟動(dòng)電子名片擴(kuò)展頭文件虽界,加入下列代碼:
// 電子名片模塊 #import "XMPPvCardTempModule.h" #import "XMPPvCardCoreDataStorage.h"
-
2、定義電子名片屬性及成員變量
- 在AppDelegate.h文件中涛菠,加入 全局電子名片模塊屬性:下列代碼莉御,
// 全局電子名片模塊
@property (nonatomic, strong,readonly) XMPPvCardTempModule *vCardModule;
- 在AppDelegate.m文件中,添加如下俗冻,電子名片數(shù)據(jù)存儲(chǔ)模塊成員變量
```objc
@interface JPAppDelegate()<XMPPStreamDelegate>{
// 自動(dòng)連接模塊
XMPPReconnect *_reconnect;
// 電子名片數(shù)據(jù)存儲(chǔ)
XMPPvCardCoreDataStorage *_vCardStorage;
// 頭像模塊
XMPPvCardAvatarModule *_vCardAvatar;
XMPPResultBlock _resultBlock;
}
- 3礁叔、為XMPPSteam添加電子名片擴(kuò)展和頭像擴(kuò)展
- 修改setupXmppStream方法:如下:
#pragma mark 初始化xmppStrem對(duì)象
-(void)setupXmppStream{
NSAssert(_xmppStream == nil, @"xmppStream對(duì)象初始化多次");
// 1. 創(chuàng)建xmppStrem對(duì)象
_xmppStream = [[XMPPStream alloc] init];
// 2. 添加代表
[_xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
// 3. 添加自動(dòng)連接模塊
_reconnect = [[XMPPReconnect alloc] init];
//激活
[_reconnect activate:_xmppStream];
//電子名片數(shù)據(jù)存儲(chǔ)
_vCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
// 4. 添加電子名片模塊
_vCardModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:_vCardStorage];
//激活
[_vCardModule activate:_xmppStream];
// 5. 添加頭像模塊
_vCardAvatar = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:_vCardModule];
[_vCardAvatar activate:_xmppStream];
}
- 4、需要我們手動(dòng)釋放資源
#pragma mark 釋放資源
-(void)teardownXmppstream{
// 移動(dòng)代理
[_xmppStream removeDelegate:self];
// 停止模塊
// 停止自動(dòng)連接模塊
[_reconnect deactivate];
// 停止電子名片模塊
[_vCardModule deactivate];
// 停止頭像模塊
[_vCardAvatar deactivate];
// 斷開連接
[_xmppStream disconnect];
// 清空資源為nil
_xmppStream = nil;
_reconnect = nil;
_vCardModule = nil;
_vCardStorage = nil;
_vCardAvatar = nil;
}
- 注意:初次運(yùn)行會(huì)自動(dòng)生成一個(gè)SQLite數(shù)據(jù)庫文件:XMPPvCard.sqlite
四迄薄、展示電子名片
- 1琅关、創(chuàng)建JPVCardViewController控制器,并導(dǎo)入頭文件
#import "JPAppDelegate.h"
#import "XMPPvCardTemp.h"
- 2讥蔽、加載電子名片數(shù)據(jù)到視圖中
@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];
}
// 電子名片數(shù)據(jù)綁定
-(void)dataBind{
//初始化登錄用戶的電子名片信息
XMPPvCardTemp *myCard = xmppDelegate.vCardModule.myvCardTemp;
if (myCard.photo) {
NSLog(@"有頭像");
//設(shè)置頭像
self.avatar.image = [UIImage imageWithData:myCard.photo];
}
//設(shè)置昵稱
self.nickNameLabel.text = myCard.nickname;
//設(shè)置jid
self.jidLabel.text = xmppDelegate.xmppStream.myJID.bare;
//設(shè)置公司
self.orgNameLabel.text = myCard.orgName;
//設(shè)置部門
if (myCard.orgUnits.count > 0) {
self.orgUnitLabel.text = myCard.orgUnits[0];
}
//設(shè)置職位
self.titleLabel.text = myCard.title;
//設(shè)置電話 (隨便用一個(gè)字段充當(dāng)電話號(hào)碼)
self.telLabel.text = myCard.note;
//設(shè)置郵件 (隨便用一個(gè)字段充當(dāng)郵件)
self.emailLabel.text = myCard.mailer;
//myCard.jid沒有正確返回當(dāng)用戶的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);
// // 職務(wù)涣易,[], 公司,部門數(shù)組
// 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);
}
五冶伞、修改電子名片
- 獲取到之前的電子名片模型新症,進(jìn)行修改,修改之后响禽,要記得更新到服務(wù)器上徒爹。
-(void)editVCardViewControllerFinish{
// 把新的電子名片數(shù)據(jù)上傳到服務(wù)
// 1. 獲取以前的電子名片數(shù)據(jù)
XMPPvCardTemp *myCard = xmppDelegate.vCardModule.myvCardTemp;
// 設(shè)置頭像
NSData *avatarData = UIImageJPEGRepresentation(self.avatar.image, 0.7);
if (avatarData) {
myCard.photo = avatarData;
}
// 昵稱
myCard.nickname = self.nickNameLabel.text;
// 公司
myCard.orgName = self.orgNameLabel.text;
// 部門是一個(gè)數(shù)組
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;
// 保存數(shù)據(jù)
// 先存儲(chǔ)到本地,接著上傳到服務(wù)器
[xmppDelegate.vCardModule updateMyvCardTemp:myCard];
}