vcf, 通讯录导出的一种格式。

一。生成vcf文件

如果要把我们iPhone通讯录里的数据, 生成vcf格式文件。

我们可以借助iCloud。

参考下面代码:

-(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);

}

}

}

原文:http://blog.csdn.net/hitwhylz/article/details/29401371

java 苹果vcf解析_iOS开发- 生成/解析.vcf文件相关推荐

  1. iOS开发- 生成/解析.vcf文件

    vcf, 通讯录导出的一种格式. 一.生成vcf文件 如果要把我们iPhone通讯录里的数据, 生成vcf格式文件. 我们可以借助iCloud. 小技巧:通过iCloud导出iPhone通讯录的方法 ...

  2. ios java模拟器 谁说_iOS开发:模拟器的那点儿事儿

    1. 警告 Can't find keyplane that supports type 4 for keyboard iPhone-Portrait-NumberPad; using 3876877 ...

  3. Android JNI开发生成.h头文件问题(转)

    在JNI开发中,首先要将建立的anroid类编译成.h文件,编译用到命令javah,由于第一次用,以前对java的编译过程也不怎么了解,所以走了好多弯路,网络没有对这一步的详细介绍,这里讲一下: 通过 ...

  4. iOS开发 生成CSR(.certSigningRequest)文件

    当在苹果开发者中心生成证书的时候需要一个CSR文件,这里需要用到一个苹果自带的KeyAccess(钥匙串访问工具)的软件,用来生成证书的申请文件. 打开钥匙串访问工具,在钥匙串访问下拉菜单选中证书助理 ...

  5. java hs err pid_JAVA 奔溃 生成hs_err_pid****的文件,求大神看看

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 运行手机模拟器 奔溃产生hs_err_pid**** 的文件, 有大神知道这样的情况会是原因不 电脑重装还是一样, 我在想, 是不是电脑硬件的问题, 我试 ...

  6. 关于vs开发生成exe.recipe文件

    如果你是想找.exe那么你找错了路径 生成的.exe在和解决方案同级的debug文件夹下

  7. windows7下,Java中利用JNI调用c++生成的动态库的使用步骤

    1.从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-wi ...

  8. 【Java】生成 .json格式文件工具类

    package com.glodon.kgb.utils.json;import java.io.File; import java.io.FileOutputStream; import java. ...

  9. java调用sap系统wsdl_Java调用Axis2用SAP WSDL生成的Stub文件

    3.Java调用Axis2用SAP WSDL生成的Stub文件 ①建立JavaWeb工程,将axis的相关jar导入至lib文件 ②将第2步生成的Stub类文件放入项目包里,再新建1个TEST测试类 ...

  10. java微信开发API解析(二)-获取消息和回复消息

    java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...

最新文章

  1. c语言标准整形,C语言整形数值范围问题
  2. No Javascript on this page
  3. 清华、北大联合调研995家中小企业,如何穿越3个月的生死火线
  4. pandas.DataFrame.set_index
  5. AngularJS: 自定义指令与控制器数据交互
  6. localhost和127.0.0.1有什么区别?(转载)
  7. 如何在MacOS中进行声音内录
  8. mos管闩锁效应理解学习
  9. 搜狗高速浏览器收藏夹怎么恢复 搜狗浏览器收藏夹恢复教程
  10. 英文版-恩光照耀-Shine Jesus Shine
  11. 2018.12.15【NOIP提高组】模拟B组 jzoj100047. 基因变异
  12. 50行Python搞定京东商品抢购
  13. 「计算机日常」笔吧测评室笔记本测评科普视频笔记
  14. 中国盐酸丁丙诺啡市场趋势报告、技术动态创新及市场预测
  15. 上班第一天,大家都在干什么呢?‘Java研发工程师上班‘
  16. 简单部署 rancher 管理kubernetes集群(3)
  17. 传奇假人自动上线_传奇商业脚本 各种M2防假人脚本大集合 传奇私服脚本
  18. 我的idea偏好设置
  19. C/C++校运动会成绩管理系统
  20. Altium Designer(AD)安装教程

热门文章

  1. 强化学习第7章——基于策略的强化学习
  2. 幸运彩票 分数 15作者 陈越单位 浙江大学
  3. 怦然心动(Flipped)-4
  4. 安卓-几种查看SHA1和MD5的方法
  5. ios播放器横竖屏切换的问题
  6. 交换机和路由器的区别_一文读懂交换机和路由器的区别
  7. 1068 万绿丛中一点红 (20 分)测试点3、5
  8. 沟通的法宝!三季人法则
  9. PYTHON 之 多线程 and 多进程
  10. 自动刷票工具的实现机理简介