Добавление данных vCard непосредственно в адресную книгу системы

Я разрабатываю считыватель QR-кода, и он должен обнаруживать и импортировать карточки контактов в формате vCard (.vcf).

есть ли способ напрямую добавить данные карты в адресную книгу системы или мне нужно самостоятельно проанализировать vCard и добавить каждое поле отдельно?

Ответ 1

Если вы работаете на 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 в своем проекте.

Ответ 2

Ответ Carter Allen работал у меня, за исключением того, что это вызвало мое приложение для сбоя в заключительном заявлении CFRelease(book);

Оказывается, оператор CFRelease(person); должен быть удален. Это остановило мое приложение от сбоев. См. Этот ответ для объяснения fooobar.com/questions/525241/...

Также проверьте разделы "Создать правило" и "Получить правила" на этой странице https://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html

Ответ 3

Контакты довольно прощающие и сделают все возможное, чтобы импортировать вашу визитную карточку, однако кажется, что ваш адрес неверен. Должно быть 7 параметров, разделенных точкой с запятой: поле PO, Suite #, адрес, город, штат, ZIP, страна. Большинство людей покидают поле PO (и набор #), поэтому в начале типичный адрес имеет точку с запятой (или две). Если ваш адрес плохо сформирован, параметры могут оказаться в неправильных местах.

Различные поля в vCard заканчиваются символом <return>: @ "\ r"

Вам не нужно CHARSET=utf-8