iOS開發- 產生/解析.vcf檔案

來源:互聯網
上載者:User

標籤:style   class   blog   code   http   tar   

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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.