【问题标题】:Source of ABRecordRef (phonebook or icloud)ABRecordRef 的来源(电话簿或 icloud)
【发布时间】:2013-02-28 08:02:44
【问题描述】:

我需要找出 ABRecordRef 的来源,因为下面的方法从电话簿和 icloud 中返回联系人数组,结果有同一个人(第一个,姓氏)的双重联系人,但 ABRecordID 记录Id = 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);
} 

【问题讨论】:

    标签: cocoa-touch abaddressbook abrecordref


    【解决方案1】:

    Source of the answer

    添加新集合

    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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      相关资源
      最近更新 更多