iOS开发- 生成/解析.vcf文件
vcf, 通讯录导出的一种格式。
一。生成vcf文件
假设要把我们iPhone通讯录里的数据, 生成vcf格式文件。
我们能够借助iCloud。
小技巧:通过iCloud导出iPhone通讯录的方法
当然, 假设你想在应用中, 利用代码生成, 全然能够。先导出通讯录数据, 再解析, 再生成vcf文件就可以。
參考以下代码:
-(NSString*)generateVCardStringWithContacts:(CFArrayRef)contacts {
NSInteger counter = 0;
NSString *vcard = @"";
for(CFIndex i = 0; i < CFArrayGetCount(contacts); i++) {
ABRecordRef person = CFArrayGetValueAtIndex(contacts, i);
NSString *firstName = (NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
firstName = (firstName ?
firstName : @"");
NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
lastName = (lastName ? lastName : @"");
NSString *middleName = (NSString *)ABRecordCopyValue(person, kABPersonMiddleNameProperty);
NSString *prefix = (NSString *)ABRecordCopyValue(person, kABPersonPrefixProperty);
NSString *suffix = (NSString *)ABRecordCopyValue(person, kABPersonSuffixProperty);
NSString *nickName = (NSString *)ABRecordCopyValue(person, kABPersonNicknameProperty);
NSString *firstNamePhonetic = (NSString *)ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty);
NSString *lastNamePhonetic = (NSString *)ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty);
NSString *organization = (NSString *)ABRecordCopyValue(person, kABPersonOrganizationProperty);
NSString *jobTitle = (NSString *)ABRecordCopyValue(person, kABPersonJobTitleProperty);
NSString *department = (NSString *)ABRecordCopyValue(person, kABPersonDepartmentProperty);
NSString *compositeName = [NSString stringWithFormat:@"%@%@",firstName,lastName];
if(i > 0) {
vcard = [vcard stringByAppendingFormat:@"\n"];
}
vcard = [vcard stringByAppendingFormat:@"BEGIN:VCARD\nVERSION:3.0\nN:%@;%@;%@;%@;%@\n",
(firstName ?
firstName : @""),
(lastName ? lastName : @""),
(middleName ? middleName : @""),
(prefix ?
prefix : @""),
(suffix ? suffix : @"")
];
vcard = [vcard stringByAppendingFormat:@"FN:%@\n",compositeName];
if(nickName) vcard = [vcard stringByAppendingFormat:@"NICKNAME:%@\n",nickName];
if(firstNamePhonetic) vcard = [vcard stringByAppendingFormat:@"X-PHONETIC-FIRST-NAME:%@\n",firstNamePhonetic];
if(lastNamePhonetic) vcard = [vcard stringByAppendingFormat:@"X-PHONETIC-LAST-NAME:%@\n",lastNamePhonetic];
// Work
if(organization) vcard = [vcard stringByAppendingFormat:@"ORG:%@;%@\n",(organization?
organization:@""),(department?department:@"")];
if(jobTitle) vcard = [vcard stringByAppendingFormat:@"TITLE:%@\n",jobTitle];
// Mail
ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
if(emails) {
for (int k = 0; k < ABMultiValueGetCount(emails); k++) {
NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(emails, k));
NSString *email = (NSString *)ABMultiValueCopyValueAtIndex(emails, k);
NSString *labelLower = [label lowercaseString];
vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=WORK:%@\n",email];
if ([labelLower isEqualToString:@"home"]) vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=HOME:%@\n",email];
else if ([labelLower isEqualToString:@"work"]) vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=WORK:%@\n",email];
else {//类型解析不出来的
counter++;
vcard = [vcard stringByAppendingFormat:@"item%d.EMAIL;type=INTERNET:%@\nitem%d.X-ABLabel:%@\n",counter,email,counter,label];
}
}
}
// Tel
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
if(phoneNumbers) {
for (int k = 0; k < ABMultiValueGetCount(phoneNumbers); k++) {
NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phoneNumbers, k));
NSString *number = (NSString *)ABMultiValueCopyValueAtIndex(phoneNumbers, k);
NSString *labelLower = [label lowercaseString];
if ([labelLower isEqualToString:@"mobile"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=CELL:%@\n",number];
else if ([labelLower isEqualToString:@"home"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=HOME:%@\n",number];
else if ([labelLower isEqualToString:@"work"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=WORK:%@\n",number];
else if ([labelLower isEqualToString:@"main"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=MAIN:%@\n",number];
else if ([labelLower isEqualToString:@"homefax"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=HOME;type=FAX:%@\n",number];
else if ([labelLower isEqualToString:@"workfax"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=WORK;type=FAX:%@\n",number];
else if ([labelLower isEqualToString:@"pager"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=PAGER:%@\n",number];
else if([labelLower isEqualToString:@"other"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=OTHER:%@\n",number];
else { //类型解析不出来的
counter++;
vcard = [vcard stringByAppendingFormat:@"item%d.TEL:%@\nitem%d.X-ABLabel:%@\n",counter,number,counter,label];
}
}
}
// Address
ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);
if(address) {
for (int k = 0; k < ABMultiValueGetCount(address); k++) {
NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(label, k));
NSDictionary *dic = (NSDictionary *)ABMultiValueCopyLabelAtIndex(address, k);
NSString *labelLower = [label lowercaseString];
NSString* country = [dic valueForKey:(NSString *)kABPersonAddressCountryKey];
NSString* city = [dic valueForKey:(NSString *)kABPersonAddressCityKey];
NSString* state = [dic valueForKey:(NSString *)kABPersonAddressStateKey];
NSString* street = [dic valueForKey:(NSString *)kABPersonAddressStreetKey];
NSString* zip = [dic valueForKey:(NSString *)kABPersonAddressZIPKey];
NSString* countryCode = [dic valueForKey:(NSString *)kABPersonAddressCountryCodeKey];
NSString *type = @"";
NSString *labelField = @"";
counter++;
if([labelLower isEqualToString:@"work"]) type = @"WORK";
else if([labelLower isEqualToString:@"home"]) type = @"HOME";
else if(label && [label length] > 0)
{
labelField = [NSString stringWithFormat:@"item%d.X-ABLabel:%@\n",counter,label];
}
vcard = [vcard stringByAppendingFormat:@"item%d.ADR;type=%@:;;%@;%@;%@;%@;%@\n%@item%d.X-ABADR:%@\n",
counter,
type,
(street ? street : @""),
(city ? city : @""),
(state ? state : @""),
(zip ? zip : @""),
(country ? country : @""),
labelField,
counter,
(countryCode ?
countryCode : @"")
];
}
}
// 剩下的不经常使用,我就不写了,要是须要。自己补全
// url
// TODO:
// IM
// TODO:
// Photo
// TODO:
vcard = [vcard stringByAppendingString:@"END:VCARD"];
}
return vcard;
}
二。
解析vcf文件
用 UIDocumentInteractionController 也就是用QuickLook去显示这个文件。
那他会自己主动的解析, 而且有加入到通讯录选项。
当然。我们也能够自己来解析。
详细代码例如以下:
//解析vcf
-(void)parseVCardString:(NSString*)vcardString
{
NSArray *lines = [vcardString componentsSeparatedByString:@"\n"]; for(NSString* line in lines)
{ if ([line hasPrefix:@"BEGIN"])
{
NSLog(@"parse start");
}
else if ([line hasPrefix:@"END"])
{
NSLog(@"parse end");
}
else if ([line hasPrefix:@"N:"])
{
NSArray *upperComponents = [line componentsSeparatedByString:@":"];
NSArray *components = [[upperComponents objectAtIndex:1] componentsSeparatedByString:@";"]; NSString * lastName = [components objectAtIndex:0];
NSString * firstName = [components objectAtIndex:1]; NSLog(@"name %@ %@",lastName,firstName); }
else if ([line hasPrefix:@"EMAIL;"])
{
NSArray *components = [line componentsSeparatedByString:@":"];
NSString *emailAddress = [components objectAtIndex:1];
NSLog(@"emailAddress %@",emailAddress); }
else if ([line hasPrefix:@"TEL;"])
{
NSArray *components = [line componentsSeparatedByString:@":"];
NSString *phoneNumber = [components objectAtIndex:1];
NSLog(@"phoneNumber %@",phoneNumber);
}
} }
iOS开发- 生成/解析.vcf文件的更多相关文章
- iOS开发 XML解析和下拉刷新,上拉加载更多
iOS开发 XML解析和下拉刷新,上拉加载更多 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示 ...
- 如何使用iOS 开发证书 和 Profile 文件
如果你想在 iOS 设备(iPhone/iPad/iTouch)上调试, 需要有 iOS 开发证书和 Profile 文件. 在你拿到这两个文件之后,该如何使用呢? 证书使用说明: 1. iOS 开 ...
- 【转】ios开发证书,描述文件,bundle ID的关系
ios开发证书,描述文件,bundle ID的关系 苹果为了控制应用的开发与发布流程,制定了一套非常复杂的机制.这里面的关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布 ...
- IOS开发--数据持久化篇文件存储(二)
前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...
- iOS开发网络篇—大文件的多线程断点下载
http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...
- iOS开发网络请求——大文件的多线程断点下载
iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...
- IOS开发之网络编程--文件压缩和解压缩
前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个 ...
- iOS开发网络篇—大文件的多线程断点下载(转)
http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了 ...
- ios开发证书,描述文件,bundle ID的关系
苹果为了控制应用的开发与发布流程,制定了一套非常复杂的机制.这里面的关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布证书(又叫"生产证书"),开发描述文 ...
随机推荐
- R语言基础-数组和列表
数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, dim),当中data必须 ...
- 运行shell命令
首先将shell命令命名为.sh文件 将上面的代码保存为test.sh.并 cd 到对应文件夹: chmod +x ./test.sh #使脚本具有运行权限 ./test.sh #运行脚本 假设报错/ ...
- UITableView属性 自己定义UITableViewCell
UITableView的属性全齐.供大家參考 附:http://www.bubuko.com/infodetail-561085.html //曾经在使用UITableView的时候,总是在cell上 ...
- c13--数组
// // main.c // 进制查表法 // // Created by xiaomage on 15/6/10. // Copyright (c) 2015年 xiaomage. All rig ...
- hdoj--2522--A simple problem(数学模拟)
A simple problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Windows挂载NFS目录权限问题
windows挂载Linux上的NFS后, 可能会出现没有权限打开文件的问题 解决方法: 在注册表中添加匿名用户的默认UID和GID 计算机\HKEY_LOCAL_MACHINE\SOFTWA ...
- c++面向对象程序设计 谭浩强 第三章答案
2: #include <iostream> using namespace std; class Date {public: Date(int,int,int); Date(int,in ...
- POJ 2923 DP
题意: 两辆车去运一堆货物,货物数量小于等于10,问最少需要几趟能把货物全部运到目的地. 思路: 思路很简单,就是状态压缩成二进制.判断一下每个状态能不能运输.再进行一下DP. 设s[]数组里记录所有 ...
- Centos7 minimal 系列之Redis集群搭建(六)
一.redis安装 借鉴上篇博客:http://www.cnblogs.com/WJ--NET/p/8176071.html 二.集群搭建 2.1.创建文件夹 mkdir redis_cluster ...
- layer.js漂亮的弹出框
它的官方网站:http://layer.layui.com/ 消息.确认框.ifame.自定义文本.旋转木马,都有按钮,是一款强大的js 弹出框: 以下为本人的简单介绍: layer.open({ t ...