Копирование контактов из одного источника в другой - PullRequest
2 голосов
/ 26 октября 2011

Я пытаюсь скопировать контакты между моим локальным источником контактов и источником контактов iCloud, и я не вижу никаких результатов.Этот код выполняется без ошибок и кажется, что он должен работать, но я не вижу вновь созданные контакты впоследствии.Кто-нибудь видит какие-либо проблемы с этим?

ABAddressBookRef addressBook = ABAddressBookCreate();

ABRecordRef abSourceSource = ABAddressBookGetSourceWithRecordID(addressBook, kABSourceTypeLocal);
ABRecordRef abDestinationSource = ABAddressBookGetSourceWithRecordID(addressBook, kABSourceTypeCardDAV);

CFArrayRef sourceContacts = ABAddressBookCopyArrayOfAllPeopleInSource(addressBook, abSourceSource);
CFArrayRef destinationContacts = ABAddressBookCopyArrayOfAllPeopleInSource(addressBook, abDestinationSource);

ABPersonCreatePeopleInSourceWithVCardRepresentation(abDestinationSource, ABPersonCreateVCardRepresentationWithPeople(sourceContacts));
ABPersonCreatePeopleInSourceWithVCardRepresentation(abSourceSource, ABPersonCreateVCardRepresentationWithPeople(destinationContacts)));

ABAddressBookSave(addressBook, NULL);

Ответы [ 2 ]

4 голосов
/ 06 апреля 2012

Существует более фундаментальная проблема - вы неправильно вызываете ABAddressBookGetSourceWithRecordID.Второй параметр, который он принимает - это int, который указывает идентификатор записи определенного источника в вашей адресной книге.Вы передаете ей константу, которая описывает тип определенного источника.

Константа, которую вы передаете, kABSourceTypeCardDav всегда равна 4. Однако идентификатор записи источника iCloud в адресной книге пользователя может быть чем-то оченьразные.

Что вам нужно сделать, это перечислить все источники и проверить их типы, например:

NSArray *allSources = (NSArray*)ABAddressBookCopyArrayOfAllSources(addressBook);

for (int i = 0; i < allSources.count; i++) {
    ABRecordRef src = [allSources objectAtIndex:i];
    NSNumber *stObj = (NSNumber*)ABRecordCopyValue(src, kABSourceTypeProperty);
    ABSourceType st = (ABSourceType)[stObj intValue];

    if (st == kABSourceTypeCardDAV) {
        int recordID = ABRecordGetRecordID(src);
        break;
    }
}

Затем вы можете использовать recordID в качестве аргумента первой функции

2 голосов
/ 11 ноября 2011

Я думаю, что вы забыли добавить записи с ABAddressBookAddRecord.Вот мой рабочий пример:

ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef abSource = ABAddressBookGetSourceWithRecordID(addressBook, kABSourceTypeLocal);
NSURL *theURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"some.vcf"];
NSData *vCardData = [NSData dataWithContentsOfURL:theURL];
NSLog(@"data %@", vCardData);
NSArray *createdPeople = (__bridge_transfer NSArray*)ABPersonCreatePeopleInSourceWithVCardRepresentation(abSource, (__bridge CFDataRef)vCardData);
NSLog(@"createdPeople %@", createdPeople);
CFErrorRef error = NULL;
bool ok;
for (id person in createdPeople) {
    error = NULL;
    ok = ABAddressBookAddRecord(addressBook, (__bridge ABRecordRef)person, &error);
    if (!ok) {
        NSLog(@"add err %@", error);  
        break;
    } 
}
if (ok) {
    error = NULL;
    BOOL isSaved = ABAddressBookSave(addressBook, &error);
    if (isSaved) {
        NSLog(@"saved..");
    }
    if (error != NULL) {
        NSLog(@"ABAddressBookSave %@", error);
    } 
}
CFRelease(addressBook);    
...