三、电子名片(vCard)(个人信息)
•简介
- vCard(或称做Versitcard)最早是由Versit联盟于1995年提出的,当时联盟成员包括苹果公司,AT&T科技(后来的朗讯),IBM及西门子。在1996年十二月,格式的拥有权移至因特网邮件联盟(IMC),此联盟是由一些关注因特网电子邮件的公司所组成
- vCard标准的2.1版被电子邮件客户端广泛支持。3.0版是一个包含在RFC 2425和RFC 2426中的IETF标准跟踪提案。vCard的常用文件扩展名是.vcf
- 不同的程序对vCard标准实现亦不同。Mac OS X中的Address Book允许把所有联系人导出到一个vcf文件,而Microsoft Outlook只能每人一个文件
- vCard是电子名片的文件格式标准,一般附加在电子邮件之后,但也可以用于其它场合(如在因特网上相互交换)
•XMPP中电子名片的使用
- 1. XEP-0054提供了一种机制,可以通过XMPP发送电子名片
- 2. 要使用个人名片首先需要在XMPPFramework.h中启用电子名片的扩展头文件:
- #import "XMPPvCardCoreDataStorage.h"
- #import "XMPPvCardTempModule.h"
- 3. 定义属性及成员变量
- 4. 为XMPPSteam添加电子名片扩展
- 5. 在需要时使用电子名片
.电子名片模块它内部实现什么功能?
>发送请求从服务器获取"电子名片(用户个人信息)"数据
<iq type="get" to="lisi@liangliang.local"><vCard xmlns="vcard-temp"/></iq>
>接到服务器返回的"电子名片"数据后,把数据缓存到本地数据库
•打开XMPP的日志
1>XMPP/Core/XMPPLogging.h 67行
XMPP_LOGGING_ENABLED设置为1
2>需要配置XMPP日志启动
在didfinishlauching方法 [DDLog addLogger:[DDTTYLogger sharedInstance]];
// 添加XMPP模块
// 1.添加电子名片模块
_vCardStorage = [XMPPvCardCoreDataStorage sharedInstance];//电子名片数据存储
_vCard = [[XMPPvCardTempModule alloc] initWithvCardStorage:_vCardStorage];//电子名片模块
// 激活
[_vCard activate:_xmppStream];
// 电子名片模块还会配置 "头像模块" 一起使用
// 2.添加 头像模块
_avatar = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:_vCard];
[_avatar activate:_xmppStream];
2>为XMPP中名片详细使用
// 1.它内部会去数据查找
// 为什么电子名片的模型是temp,因为解析电子名片的xml没有完善,有此节点并未解析,所以称为临时
XMPPvCardTemp *myvCard = [WCXMPPTool sharedWCXMPPTool].vCard.myvCardTemp;
// 获取头像
if (myvCard.photo) {
self.avatarImgView.image = [UIImage imageWithData:myvCard.photo];
}
// 微信号 (显示用户名)
self.wechatNumLabel.text =[WCAccount shareAccount].loginUser;
self.nicknameLabel.text = myvCard.nickname;
//公司
self.orgNameLabel.text = myvCard.orgName;
//部门
if (myvCard.orgUnits.count > 0) {
self.departmentLabel.text = myvCard.orgUnits[0];
}
//职位
self.titleLabel.text = myvCard.title;
//电话
//self.telLabel.text = myvCard.telecomsAddresses[0];
//使用note充当电话
self.telLabel.text = myvCard.note;
//邮箱
// 使用mailer充当
self.emailLabel.text = myvCard.mailer;
3>为XMPP中花名册的使用
- 1. 要使用花名册首先需要在XMPPFramework.h中启用电子名片的扩展头文件:
- #import "XMPPRoster.h"
- #import "XMPPRosterCoreDataStorage.h"
- 2. 定义属性及成员变量
- 3. 为XMPPSteam添加花名册扩展
- 4. 设置花名册代理
- 5. 在需要时使用花名册
// 实例化花名册模块
_xmppRosterStorage = [[XMPPRosterCoreDataStorage alloc] init];
_xmppRoster = [[XMPPRoster alloc] initWithRosterStorage:_xmppRosterStorage];
// * 设置花名册属性
[_xmppRoster setAutoFetchRoster:YES];
[_xmppRoster setAutoAcceptKnownPresenceSubscriptionRequests:YES];
// 激活花名册模块
[_xmppRoster activate:_xmppStream];
- 导入CoreData框架
- 使用NSFetchedResultsController(抓取结果控制器)可以有效地管理从Core Data抓取返回的数据结果,并为UITableView对象提供数据
-(void)loadUsers{
//显示好友数据 (保存XMPPRoster.sqlite文件)
//1.上下文 关联XMPPRoster.sqlite文件
NSManagedObjectContext *rosterContext = [WCXMPPToolsharedWCXMPPTool].rosterStorage.mainThreadManagedObjectContext;
//2.Request 请求查询哪张表
NSFetchRequest *request = [NSFetchRequestfetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];
//设置排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"displayName"ascending:YES];
request.sortDescriptors = @[sort];
//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];
}
#pragma mark -结果控制器的代理
#pragma mark -数据库内容改变
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
//WCLog(@"%@",[NSThread currentThread]);
//刷新表格
[self.tableView reloadData];
}
#pragma mark -显示的cell方法
-(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;
// 通过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:
break;
}
return cell;
}