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];// 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文件相关推荐
- iOS开发 生成CSR(.certSigningRequest)文件
当在苹果开发者中心生成证书的时候需要一个CSR文件,这里需要用到一个苹果自带的KeyAccess(钥匙串访问工具)的软件,用来生成证书的申请文件. 打开钥匙串访问工具,在钥匙串访问下拉菜单选中证书助理 ...
- ios开发之使用多文件上传的简单封装最原始的
ios开发之使用多文件上传的简单封装最原始的 // // ViewController.m // 18-上传多个文件 // // Created by 鲁军 on 2021/2/13. //#impo ...
- IOS开发基础之单文件上传基础最原始的方式
IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...
- 如何最简洁的使用iOS 开发证书 和 Profile 文件
如果你想在 iOS 设备(iPhone/iPad/iTouch)上调试, 需要有 iOS 开发证书和 Profile 文件. 在你拿到这两个文件之后,该如何使用呢? 证书使用说明: 1. iOS 开发 ...
- iOS开发证书和Profile文件 介绍以及使用
IOS开发环境,证书和授权文件是什么? 一.成员介绍 1.Certification(证书) 证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种: 1)Developer Certificat ...
- java利用io流读取文件发生了乱码以及java解析vcf文件
如果文件中含有中文字符,那么这时候直接进行读取,即new FileInputStream(要读取的文件),就会出现了乱码,所以这时候,我们需要设置对应的格式进行读取,所以还需要传递对应的编码,所以将代 ...
- IOS开发基础之解压缩文件技术
IOS开发基础之解压缩文件技术 这里我们使用的第三方框架SSZipArchive,第三方依赖libz.tbd 库 ,基于C语言的,加入libz.tbd框架支持. 服务器我们选择是Java Web 的T ...
- iOS开发,导入c文件引发的Could not build module 'Foundation'问题
iOS开发,导入c文件引发的 Unknown type name 'NSString' 问题 今天看到个问题,编辑工程提示Unknown type name 'NSString',如下图 导致出现异常 ...
- ios 开发证书导出p12文件_如何生成苹果开发者证书及描述文件
描述证书:Provisioning Profile,需要在苹果后台用开发者账号生成的一种签名文件,分为dev.dis.adhoc三种:dev为调试专用,打出来的ipa包无法用于提审:dis用于调试,用 ...
最新文章
- tensorflow checkpoint文件
- POJ 1330 Nearest Common Ancestors 【LCA模板题】
- 1687: 数组操作(非常规思维)
- 【Linux】一步一步学Linux——ipcs命令(141)
- Taro+react开发(66):注意定义margin的位置
- 团队项目第二次冲刺(4)
- svn版利用什么技术实现_金葱粉涂料印花利用了什么技术?
- pytorch中CrossEntropyLoss和NLLLoss的区别与联系
- python可变类型做默认参数
- 了解 Adobe Scout 收集和使用的数据
- Python正则表达式模式备忘表
- Launcher3无图标问题
- 【信源编码】Huffman Coding原理以及MATLAB实现
- XPS格式文件如何编辑?
- python使用二分搜索求log以2为底10的近似值
- Centos7.8下Nmap的安装与使用
- 下午又出去……还不是为自己办事儿……电脑最近也开始闹别扭 ◎◎
- 【IOS】IOS工程自动打包并发布脚本实现
- 云原生和云计算的区别,普通人都能看懂!
- [SCU 4499] 表达式 (IDA*)
热门文章
- 史上最惨的新浪程序员!结婚、度蜜月都在加班扩容!媳妇:那生小孩呢!?
- 浪潮盒子IPBS9505-多遥控版-S905L/M2芯片-安卓4.4.2-线刷固件包
- 360安全浏览器新标签页被2345流氓网址劫持的解决办法
- 通达OA任意用户登录漏洞复现
- C语言字符串替换函数(strrpl)
- Qt可拖拽排序表格(解决滚动条不兼容问题,类似QQ好友分组排序)
- 文件改日期 电梯卡dump_【求助】电梯卡延期修改
- 大众继续深耕SUV市场:5款新车型先于上海车展登场,ID. ROOMZZ成点睛之笔...
- 高中计算机阅卷要求,传说中的高考电脑阅卷是这样的!细节决定分数
- vs2015中无法设置Qt版本,qt project setting 是灰色,Qt无法编译ui文件