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];// Workif(organization) vcard = [vcard stringByAppendingFormat:@"ORG:%@;%@\n",(organization?organization:@""),(department?department:@"")];if(jobTitle) vcard = [vcard stringByAppendingFormat:@"TITLE:%@\n",jobTitle];// MailABMultiValueRef 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];}}}// TelABMultiValueRef 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];}}}// AddressABMultiValueRef 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开发 生成CSR(.certSigningRequest)文件

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

  2. ios开发之使用多文件上传的简单封装最原始的

    ios开发之使用多文件上传的简单封装最原始的 // // ViewController.m // 18-上传多个文件 // // Created by 鲁军 on 2021/2/13. //#impo ...

  3. IOS开发基础之单文件上传基础最原始的方式

    IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...

  4. 如何最简洁的使用iOS 开发证书 和 Profile 文件

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

  5. iOS开发证书和Profile文件 介绍以及使用

    IOS开发环境,证书和授权文件是什么? 一.成员介绍 1.Certification(证书) 证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种: 1)Developer Certificat ...

  6. java利用io流读取文件发生了乱码以及java解析vcf文件

    如果文件中含有中文字符,那么这时候直接进行读取,即new FileInputStream(要读取的文件),就会出现了乱码,所以这时候,我们需要设置对应的格式进行读取,所以还需要传递对应的编码,所以将代 ...

  7. IOS开发基础之解压缩文件技术

    IOS开发基础之解压缩文件技术 这里我们使用的第三方框架SSZipArchive,第三方依赖libz.tbd 库 ,基于C语言的,加入libz.tbd框架支持. 服务器我们选择是Java Web 的T ...

  8. iOS开发,导入c文件引发的Could not build module 'Foundation'问题

    iOS开发,导入c文件引发的 Unknown type name 'NSString' 问题 今天看到个问题,编辑工程提示Unknown type name 'NSString',如下图 导致出现异常 ...

  9. ios 开发证书导出p12文件_如何生成苹果开发者证书及描述文件

    描述证书:Provisioning Profile,需要在苹果后台用开发者账号生成的一种签名文件,分为dev.dis.adhoc三种:dev为调试专用,打出来的ipa包无法用于提审:dis用于调试,用 ...

最新文章

  1. tensorflow checkpoint文件
  2. POJ 1330 Nearest Common Ancestors 【LCA模板题】
  3. 1687: 数组操作(非常规思维)
  4. 【Linux】一步一步学Linux——ipcs命令(141)
  5. Taro+react开发(66):注意定义margin的位置
  6. 团队项目第二次冲刺(4)
  7. svn版利用什么技术实现_金葱粉涂料印花利用了什么技术?
  8. pytorch中CrossEntropyLoss和NLLLoss的区别与联系
  9. python可变类型做默认参数
  10. 了解 Adobe Scout 收集和使用的数据
  11. Python正则表达式模式备忘表
  12. Launcher3无图标问题
  13. 【信源编码】Huffman Coding原理以及MATLAB实现
  14. XPS格式文件如何编辑?
  15. python使用二分搜索求log以2为底10的近似值
  16. Centos7.8下Nmap的安装与使用
  17. 下午又出去……还不是为自己办事儿……电脑最近也开始闹别扭 ◎◎
  18. 【IOS】IOS工程自动打包并发布脚本实现
  19. 云原生和云计算的区别,普通人都能看懂!
  20. [SCU 4499] 表达式 (IDA*)

热门文章

  1. 史上最惨的新浪程序员!结婚、度蜜月都在加班扩容!媳妇:那生小孩呢!?
  2. 浪潮盒子IPBS9505-多遥控版-S905L/M2芯片-安卓4.4.2-线刷固件包
  3. 360安全浏览器新标签页被2345流氓网址劫持的解决办法
  4. 通达OA任意用户登录漏洞复现
  5. C语言字符串替换函数(strrpl)
  6. Qt可拖拽排序表格(解决滚动条不兼容问题,类似QQ好友分组排序)
  7. 文件改日期 电梯卡dump_【求助】电梯卡延期修改
  8. 大众继续深耕SUV市场:5款新车型先于上海车展登场,ID. ROOMZZ成点睛之笔...
  9. 高中计算机阅卷要求,传说中的高考电脑阅卷是这样的!细节决定分数
  10. vs2015中无法设置Qt版本,qt project setting 是灰色,Qt无法编译ui文件