分享

iOS开发生成/解析.vcf文件vCard解析<div></div>

 最初九月雪 2015-04-16

一。生成vcf文件

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

我们可以借助iCloud。

小技巧:通过iCloud导出iPhone通讯录的方法

当然, 如果你想在应用中, 利用代码生成, 完全可以。先导出通讯录数据, 再解析, 再生成vcf文件即可。

参考下面代码:

001.-(NSString*)generateVCardStringWithContacts:(CFArrayRef)contacts {
002.NSInteger counter  = 0;
003.NSString *vcard = @"";
004. 
005.for(CFIndex i = 0; i < CFArrayGetCount(contacts); i++) {
006. 
007.ABRecordRef person = CFArrayGetValueAtIndex(contacts, i);
008. 
009.NSString *firstName = (NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
010.firstName = (firstName ? firstName : @"");
011.NSString *lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
012.lastName = (lastName ? lastName : @"");
013.NSString *middleName = (NSString *)ABRecordCopyValue(person, kABPersonMiddleNameProperty);
014.NSString *prefix = (NSString *)ABRecordCopyValue(person, kABPersonPrefixProperty);
015.NSString *suffix = (NSString *)ABRecordCopyValue(person, kABPersonSuffixProperty);
016.NSString *nickName = (NSString *)ABRecordCopyValue(person, kABPersonNicknameProperty);
017.NSString *firstNamePhonetic = (NSString *)ABRecordCopyValue(person, kABPersonFirstNamePhoneticProperty);
018.NSString *lastNamePhonetic = (NSString *)ABRecordCopyValue(person, kABPersonLastNamePhoneticProperty);
019. 
020.NSString *organization = (NSString *)ABRecordCopyValue(person, kABPersonOrganizationProperty);
021.NSString *jobTitle = (NSString *)ABRecordCopyValue(person, kABPersonJobTitleProperty);
022.NSString *department = (NSString *)ABRecordCopyValue(person, kABPersonDepartmentProperty);
023. 
024.NSString *compositeName = [NSString stringWithFormat:@"%@%@",firstName,lastName];
025. 
026.if(i > 0) {
027.vcard = [vcard stringByAppendingFormat:@"\n"];
028.}
029. 
030.vcard = [vcard stringByAppendingFormat:@"BEGIN:VCARD\nVERSION:3.0\nN:%@;%@;%@;%@;%@\n",
031.(firstName ? firstName : @""),
032.(lastName ? lastName : @""),
033.(middleName ? middleName : @""),
034.(prefix ? prefix : @""),
035.(suffix ? suffix : @"")
036.];
037. 
038.vcard = [vcard stringByAppendingFormat:@"FN:%@\n",compositeName];
039.if(nickName) vcard = [vcard stringByAppendingFormat:@"NICKNAME:%@\n",nickName];
040.if(firstNamePhonetic) vcard = [vcard stringByAppendingFormat:@"X-PHONETIC-FIRST-NAME:%@\n",firstNamePhonetic];
041.if(lastNamePhonetic) vcard = [vcard stringByAppendingFormat:@"X-PHONETIC-LAST-NAME:%@\n",lastNamePhonetic];
042. 
043.// Work
044.if(organization) vcard = [vcard stringByAppendingFormat:@"ORG:%@;%@\n",(organization?organization:@""),(department?department:@"")];
045. 
046.if(jobTitle) vcard = [vcard stringByAppendingFormat:@"TITLE:%@\n",jobTitle];
047. 
048.// Mail
049.ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
050.if(emails) {
051.for (int k = 0; k < ABMultiValueGetCount(emails); k++) {
052.NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(emails, k));
053.NSString *email = (NSString *)ABMultiValueCopyValueAtIndex(emails, k);
054.NSString *labelLower = [label lowercaseString];
055. 
056.vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=WORK:%@\n",email];
057. 
058.if ([labelLower isEqualToString:@"home"]) vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=HOME:%@\n",email];
059.else if ([labelLower isEqualToString:@"work"]) vcard = [vcard stringByAppendingFormat:@"EMAIL;type=INTERNET;type=WORK:%@\n",email];
060.else {//类型解析不出来的
061.counter++;
062.vcard = [vcard stringByAppendingFormat:@"item%d.EMAIL;type=INTERNET:%@\nitem%d.X-ABLabel:%@\n",counter,email,counter,label];
063.}
064.}
065.}
066. 
067.// Tel
068.ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
069.if(phoneNumbers) {
070.for (int k = 0; k < ABMultiValueGetCount(phoneNumbers); k++) {
071.NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phoneNumbers, k));
072.NSString *number = (NSString *)ABMultiValueCopyValueAtIndex(phoneNumbers, k);
073.NSString *labelLower = [label lowercaseString];
074. 
075.if ([labelLower isEqualToString:@"mobile"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=CELL:%@\n",number];
076.else if ([labelLower isEqualToString:@"home"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=HOME:%@\n",number];
077.else if ([labelLower isEqualToString:@"work"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=WORK:%@\n",number];
078.else if ([labelLower isEqualToString:@"main"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=MAIN:%@\n",number];
079.else if ([labelLower isEqualToString:@"homefax"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=HOME;type=FAX:%@\n",number];
080.else if ([labelLower isEqualToString:@"workfax"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=WORK;type=FAX:%@\n",number];
081.else if ([labelLower isEqualToString:@"pager"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=PAGER:%@\n",number];
082.else if([labelLower isEqualToString:@"other"]) vcard = [vcard stringByAppendingFormat:@"TEL;type=OTHER:%@\n",number];
083.else { //类型解析不出来的
084.counter++;
085.vcard = [vcard stringByAppendingFormat:@"item%d.TEL:%@\nitem%d.X-ABLabel:%@\n",counter,number,counter,label];
086.}
087.}
088.}
089. 
090.// Address
091.ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);
092.if(address) {
093.for (int k = 0; k < ABMultiValueGetCount(address); k++) {
094.NSString *label = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(label, k));
095.NSDictionary *dic = (NSDictionary *)ABMultiValueCopyLabelAtIndex(address, k);
096.NSString *labelLower = [label lowercaseString];
097.NSString* country = [dic valueForKey:(NSString *)kABPersonAddressCountryKey];
098.NSString* city = [dic valueForKey:(NSString *)kABPersonAddressCityKey];
099.NSString* state = [dic valueForKey:(NSString *)kABPersonAddressStateKey];
100.NSString* street = [dic valueForKey:(NSString *)kABPersonAddressStreetKey];
101.NSString* zip = [dic valueForKey:(NSString *)kABPersonAddressZIPKey];
102.NSString* countryCode = [dic valueForKey:(NSString *)kABPersonAddressCountryCodeKey];
103.NSString *type = @"";
104.NSString *labelField = @"";
105.counter++;
106. 
107.if([labelLower isEqualToString:@"work"]) type = @"WORK";
108.else if([labelLower isEqualToString:@"home"]) type = @"HOME";
109.else if(label && [label length] > 0)
110.{
111.labelField = [NSString stringWithFormat:@"item%d.X-ABLabel:%@\n",counter,label];
112.}
113. 
114.vcard = [vcard stringByAppendingFormat:@"item%d.ADR;type=%@:;;%@;%@;%@;%@;%@\n%@item%d.X-ABADR:%@\n",
115.counter,
116.type,
117.(street ? street : @""),
118.(city ? city : @""),
119.(state ? state : @""),
120.(zip ? zip : @""),
121.(country ? country : @""),
122.labelField,
123.counter,
124.(countryCode ? countryCode : @"")
125.];
126.}
127.}
128. 
129. 
130.// 剩下的不常用,我就不写了,要是需要,自己补全
131.// url
132.// TODO:
133. 
134.// IM
135.// TODO:
136. 
137.// Photo
138.// TODO:
139. 
140.vcard = [vcard stringByAppendingString:@"END:VCARD"];
141.}
142. 
143.return vcard;
144.}



二。解析vcf文件

用 UIDocumentInteractionController 也就是用QuickLook去显示这个文件。 那他会自动的解析, 并且有添加到通讯录选项。


当然,我们也可以自己来解析。

具体代码如下:

01.//解析vcf
02.-(void)parseVCardString:(NSString*)vcardString
03.{
04.NSArray *lines = [vcardString componentsSeparatedByString:@"\n"];
05. 
06.for(NSString* line in lines)
07.{
08. 
09.if ([line hasPrefix:@"BEGIN"])
10.{
11.NSLog(@"parse start");
12.}
13.else if ([line hasPrefix:@"END"])
14.{
15.NSLog(@"parse end");
16.}
17.else if ([line hasPrefix:@"N:"])
18.{
19.NSArray *upperComponents = [line componentsSeparatedByString:@":"];
20.NSArray *components = [[upperComponents objectAtIndex:1] componentsSeparatedByString:@";"];
21. 
22.NSString * lastName = [components objectAtIndex:0];
23.NSString * firstName = [components objectAtIndex:1];
24. 
25.NSLog(@"name %@ %@",lastName,firstName);
26. 
27.}
28.else if ([line hasPrefix:@"EMAIL;"])
29.{
30.NSArray *components = [line componentsSeparatedByString:@":"];
31.NSString *emailAddress = [components objectAtIndex:1];
32.NSLog(@"emailAddress %@",emailAddress);
33. 
34.}
35.else if ([line hasPrefix:@"TEL;"])
36.{
37.NSArray *components = [line componentsSeparatedByString:@":"];
38.NSString *phoneNumber = [components objectAtIndex:1];
39.NSLog(@"phoneNumber %@",phoneNumber);
40.}
41.}
42. 
43.}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约