Добавление данных vCard непосредственно в системную адресную книгу - PullRequest
10 голосов
/ 14 ноября 2011

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

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

Ответы [ 3 ]

13 голосов
/ 14 ноября 2011

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

4 голосов
/ 01 марта 2012

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

Получается, что оператор CFRelease(person); следует удалить.Это остановило мое приложение от сбоя.См. Этот ответ для объяснения https://stackoverflow.com/a/1337086/881103

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

1 голос
/ 24 сентября 2012

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

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

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

...