Источник ABRecordRef (телефонная книга или icloud)

Мне нужно выяснить источник ABRecordRef, потому что метод ниже возвращает массив контактов из телефонной книги и icloud, и в результате возникают двойные контакты с одним и тем же человеком (имя, фамилия), но с другим ABRecordID recordId=ABRecordGetRecordID(запись);?

ABAddressBookRef addressBook;
if ([self isABAddressBookCreateWithOptionsAvailable]) {
    CFErrorRef error = nil;
    addressBook = ABAddressBookCreateWithOptions(NULL,&error);

    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {

        dispatch_async(dispatch_get_main_queue(), ^{

            if (error) {

            } else if (!granted) {

            } else {
                CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
                CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

                for (int i = 0; i < nPeople; i++) {
                    // Get the next address book record.
                    ABRecordRef record = CFArrayGetValueAtIndex(allPeople, i);

                    ABRecordID recordId=ABRecordGetRecordID(record);

                    NSString* firstName = (__bridge_transfer NSString*)ABRecordCopyValue(record,kABPersonFirstNameProperty);
                    NSString* lastName = (__bridge_transfer NSString*)ABRecordCopyValue(record,kABPersonLastNameProperty);

                    CFTypeRef bDayProperty = ABRecordCopyValue((ABRecordRef)record, kABPersonBirthdayProperty);

                    NSDate *birthday;

                    if (ABRecordCopyValue((ABRecordRef)record, kABPersonBirthdayProperty))
                    {
                        birthday=(__bridge NSDate*)bDayProperty;
                    }

                }
                CFRelease(addressBook);

            }
        });
    });
} else {
    // iOS 4/5
    addressBook = ABAddressBookCreate();
    CFRelease(addressBook);
} 

1 ответ

Решение

Источник ответа

добавить новый набор

NSMutableSet *linkedPersonsToSkip = [[NSMutableSet alloc] init];

и просто проверить для каждого человека

if ([linkedPersonsToSkip containsObject:(__bridge id)(record)]) {
                            continue;
}

NSArray *linked = (__bridge NSArray *) ABPersonCopyArrayOfAllLinkedPeople(record);
if ([linked count] > 1) {
   [linkedPersonsToSkip addObjectsFromArray:linked];
}
Другие вопросы по тегам