Adding vCard data directly to the system Address Book

筅森魡賤 提交于 2019-12-02 21:04:50
Carter Allen

If you're running on iOS 5 or later, this code should do the trick:

#import <AddressBook/AddressBook.h>

// This gets the vCard data from a file in the app bundle called vCard.vcf
//NSURL *vCardURL = [[NSBundle bundleForClass:self.class] URLForResource:@"vCard" withExtension:@"vcf"];
//CFDataRef vCardData = (CFDataRef)[NSData dataWithContentsOfURL:vCardURL];

// This version simply uses a string. I'm assuming you'll get that from somewhere else.
NSString *vCardString = @"vCardDataHere";
// This line converts the string to a CFData object using a simple cast, which doesn't work under ARC
CFDataRef vCardData = (CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding];
// If you're using ARC, use this line instead:
//CFDataRef vCardData = (__bridge CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding];

ABAddressBookRef book = ABAddressBookCreate();
ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book);
CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData);
for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) {
    ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index);
    ABAddressBookAddRecord(book, person, NULL);
}

CFRelease(vCardPeople);
CFRelease(defaultSource);
ABAddressBookSave(book, NULL);
CFRelease(book);

Make sure to link to the AddressBook framework in your project.

Tom Epps

Carter Allen's answer worked for me except that it caused my app to crash on the final statement CFRelease(book);

It turns out that the CFRelease(person); statement should be removed. Doing so stopped my app from crashing. See this answer for explanation https://stackoverflow.com/a/1337086/881103

Also checkout The Create Rule and The Get Rule sections on this page https://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html

Contacts is pretty forgiving and will do its best to import your vCard, however it seems that your address is not correct. There should be 7 parameters, separated by semicolons: PO box, Suite #, street address, city, state, ZIP, country. Most people leave off the PO box (and suite #), which is why a typical address has a semicolon (or two) at the beginning. If your address is ill-formed, parameters might end up in the wrong places.

The various fields in a vCard are terminated by a <return>: @"\r"

You don't need CHARSET=utf-8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!