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,开发证书,发布证书(又叫"生产证书"),开发描述文 ...
随机推荐
- OpenCV+海康威视摄像头的实时读取
OpenCV+海康威视摄像头的实时读取 本文由 @lonelyrains出品.转载请注明出处. 文章链接: http://blog.csdn.net/lonelyrains/article/detai ...
- 【为小白菜打call】
作为本校的竞赛生,我必须为我大OJ打call caioj,小白菜oj,顾名思义,就是为刚踏进OI的“小白菜”们准备的网站,里面包含了许多专题内容,各种模版和讲解视频 而且对于刚学习C++的同学,更有帮 ...
- spark Bisecting k-means(二分K均值算法)
Bisecting k-means(二分K均值算法) 二分k均值(bisecting k-means)是一种层次聚类方法,算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二.之后选择能最大程 ...
- mybatis的sql语句导致索引失效,使得查询超时
mybaitis书写sql需要特别注意where条件中的语句,否则将会导致索引失效,使得查询总是超时.如下语句会出现导致索引失效的情况: with test1 as (select count(C_F ...
- 视图 Model转集合
@{ Layout = null;}@using MvcApplication2.Models <!DOCTYPE html> <html><head> ...
- input上传文件检测文件大小
前几天在做 input[type='file'] 上传图片时,需要检测上传文件的内存大小,写了一个小demo,在此做一总结: <!DOCTYPE html> <html lang=& ...
- BottomSheetBehavior 结合CoordinatorLayout实现底部栏
1.xml <?xml version="1.0" encoding="utf-8"?> <android.support.design.wi ...
- GradientDrawable类的利用动态设置样式中的颜色
1.xml样式文件 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=& ...
- 面试题sql
查询书的价格10到20 之前显示10to20 没有显示unknown CREATE TABLE book(price INT,NAME VARCHAR(20)) SELECT NAME AS '名字' ...
- 小程序(Wepy)--生成海报图片
对于小程序的分享, 除了分享给朋友, 好友群,是可以直接做到的, 但是要想扩大推广范围, 通过生成海报图片, 将自己小程序码带进去,应该是目前我所知的好办法了. 但是海报也不是那么好搞.之前自己手写出 ...