2

我需要找出 ABRecordRef 的来源,因为下面的方法从电话簿和 icloud 返回联系人数组,结果有同一个人(第一个,姓氏)的双重联系人,但 ABRecordID recordId=ABRecordGetRecordID(record );?

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);
} 
4

1 回答 1

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];
}
于 2013-02-28T09:28:17.713 回答