将vCard数据直接添加到系统地址簿

我正在devise一个QR码阅读器,它需要检测并导入名片格式(.vcf)的联系人名片。

有没有办法直接将卡数据添加到系统地址簿,还是我需要自己parsingvCard并单独添加每个字段?

如果你在iOS 5或更高版本上运行,这个代码应该做的伎俩:

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

确保链接到项目中的AddressBook框架。

卡特·艾伦的答案为我工作,除了它导致我的应用程序崩溃在最后的声明CFRelease(book);

事实certificate, CFRelease(person); 声明应该被删除。 这样做阻止了我的应用程序崩溃。 看到这个答案的解释https://stackoverflow.com/a/1337086/881103

另外签出此页上的创build规则和获取规则部分https://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html

联系人相当宽容,并将尽最大努力导入您的电子名片,但似乎你的地址是不正确的。 应该有7个参数,用分号隔开:邮政信箱,套房号,街道地址,城市,州,邮编,国家。 大多数人离开邮政信箱(和套房#),这就是为什么一个典型的地址在一开始就有一个分号(或两个)。 如果你的地址不合格,参数可能会在错误的地方出现。

电子名片中的各个字段以<return>结尾:@“\ r”

你不需要CHARSET=utf-8