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文件的更多相关文章

  1. iOS开发 XML解析和下拉刷新,上拉加载更多

    iOS开发 XML解析和下拉刷新,上拉加载更多 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示 ...

  2. 如何使用iOS 开发证书 和 Profile 文件

    如果你想在 iOS 设备(iPhone/iPad/iTouch)上调试, 需要有 iOS 开发证书和 Profile 文件. 在你拿到这两个文件之后,该如何使用呢? 证书使用说明: 1.  iOS 开 ...

  3. 【转】ios开发证书,描述文件,bundle ID的关系

    ios开发证书,描述文件,bundle ID的关系   苹果为了控制应用的开发与发布流程,制定了一套非常复杂的机制.这里面的关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布 ...

  4. IOS开发--数据持久化篇文件存储(二)

    前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...

  5. iOS开发网络篇—大文件的多线程断点下载

    http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...

  6. iOS开发网络请求——大文件的多线程断点下载

    iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...

  7. IOS开发之网络编程--文件压缩和解压缩

    前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个 ...

  8. iOS开发网络篇—大文件的多线程断点下载(转)

    http://www.cnblogs.com/wendingding/p/3947550.html   iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了 ...

  9. ios开发证书,描述文件,bundle ID的关系

    苹果为了控制应用的开发与发布流程,制定了一套非常复杂的机制.这里面的关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布证书(又叫"生产证书"),开发描述文 ...

随机推荐

  1. Android接口和框架学习

    Android接口和框架学习 缩写: HAL:HardwareAbstraction Layer.硬件抽象层 CTS:CompatibilityTest Suite,兼容性測试套件 Android让你 ...

  2. SharePoint 创建网站地图树视图及格式枚举截图

    SharePoint 创建网站地图树视图及格式枚举截图         SharePoint首页隐藏掉左側导航以后,假设要以树视图呈现站点地图也非常easy.         仅仅须要复制v4.mas ...

  3. 0x36 组合计数

    组合计算的性质: C(n,m)= m! / (n!(m-n)!) C(n,m)=C(m-n,m); C(n,m)=C(n,m-1)+C(n-1,m-1); 二项式定理:(a+b)^n=sigema(k ...

  4. USACO 2.1 Ordered Fractions

    Ordered Fractions Consider the set of all reduced fractions between 0 and 1 inclusive with denominat ...

  5. Ubuntu 16.04或14.04里下安装搜狗输入法(图文详解)(全网最简单)

    不多说,直接上干货! 其实啊,很简单 分三步走 1.添加fcitx的键盘输入法系统,因为sogou是基于fcitx的,而系统默认的是iBus: 2.安装sogou输入法: 3.设置系统参数及一些注意点 ...

  6. c++ sort函数的用法

    C++ sort函数用法 FROM:http://hi.baidu.com/blackdemonfish/blog/item/e2c1d655d702a45ed0090652%2Ehtml 最近算法作 ...

  7. Incorrect integer value: '' for column 'RegNum' at row 1

    数据库版本: 5.6.16​​操作系统: Red Hat Enterprise Linux Server release 6.3 (Santiago)​​在插入数据的时候提示告警:​mysql> ...

  8. Activiti Modeler 5.22.0整合到Spring项目

    转载 https://blog.csdn.net/u010411264/article/details/71480354

  9. Python2以及Python3中的除法

    前言 在讨论话题之前,我们先说下程序中除法的三种情况: 1. 传统的除法,我称之为整型地板除.在C.C++.Java中常见,特点是整数相除舍弃小数取整,浮点数相除则保留小数(如果有). >> ...

  10. CentOS 7 安装配置MySQL

    环境 CentOS Linux release 7.5.1804 (Core) MySQL:mysql80-community-release-el7-1 检查: 在centos7中默认的是maria ...