从ABAddressBook获取合并/统一条目

Ami*_*aor 18 linked-list objective-c contacts addressbook ios4

我正在开发一个显示iPhone联系人的应用程序.

ABAddressBookRef返回在iPhone联系人应用程序中仅出现一次的联系人的重复条目.

查看联系人卡片(来自iPhone联系人),在底部有一个名为"链接联系人"的部分,所以显然苹果"合并"/"统一"这两个条目到我看到的那个.

这里的问题是模仿相同行为的最佳方式是什么,所以我的应用只显示一个条目?是否有一个API从地址簿中返回合并/统一的条目?

Min*_*sai 26

要创建在链接的联系人中合并的联系人列表:

注意:ABPerson引用存储在自定义Person类实例中.然后使用每个人的记录ID作为关键字将所有人存储在字典地址簿字典中.


1.使用ABAddressBookCopyArrayOfAllPeople获取所有ABPersons. 将人员存储在allPersonRecords数组中.

2.遍历所有ABPersons.


2.1获取每个ABPerson的链接人员列表.使用

ABPersonCopyArrayOfAllLinkedPeople(ABRecordRef人);

如果没有链接的联系人,此方法将返回一个数组,包括他/她自己的人参考.因此,如果返回数组的计数> 1,则该人员已链接了联系人.

2.2将链接的人员添加到NSMutableSet. 这些链接的人将被跳过,并且在将来的迭代中不会被处理.

2.3为当前ABPerson创建Person实例.

2.4将链接的人员信息合并到Person实例中.链接的人可能具有不同的电话号码,因此您需要将它们合并在一起.


NSArray *allPersonRecords = (NSArray *) ABAddressBookCopyArrayOfAllPeople(self.addressBook);
NSMutableSet *linkedPersonsToSkip = [[NSMutableSet alloc] init];

for (int i=0; i<[allPersonRecords count]; i++){

    ABRecordRef personRecordRef = [allPersonRecords objectAtIndex:i];

    // skip if contact has already been merged
    //
    if ([linkedPersonsToSkip containsObject:personRecordRef]) {
        continue;
    }

    // Create object representing this person
    //
    Person *thisPerson = [[Person alloc] initWithPersonRef:personRecordRef];

    // check if there are linked contacts & merge their contact information
    //
    NSArray *linked = (NSArray *) ABPersonCopyArrayOfAllLinkedPeople(personRecordRef);
    if ([linked count] > 1) {
        [linkedPersonsToSkip addObjectsFromArray:linked];

        // merge linked contact info
        for (int m = 0; m < [linked count]; m++) {
            ABRecordRef iLinkedPerson = [linked objectAtIndex:m];
            // don't merge the same contact
            if (iLinkedPerson == personRecordRef) {
                continue;
            }
            [thisPerson mergeInfoFromPersonRef:iLinkedPerson];
        }
    }
    [self.addressBookDictionary setObject:thisPerson forKey:thisPerson.recordID];
    [thisPerson release];
    [linked release];
}
[linkedPersonsToSkip release];
[allPersonRecords release];
Run Code Online (Sandbox Code Playgroud)

  • 嗨,您可以在代码中描述Person类包含的内容吗? (4认同)

Car*_*ter 7

你需要看看一个名为的函数:

CFArrayRef ABPersonCopyArrayOfAllLinkedPeople(ABRecordRef人);

该函数在ABPerson.h中定义.您为一个人传入ABRecordRef,该函数返回一个ABRecordRef对象数组,表示链接到您传入的人的地址簿卡.

  1. 制作包含从ABAddressBookRef返回的地址簿条目的数组的可变副本.为了便于讨论,请将此新数组称为"finalContacts".

  2. 迭代原始的联系人数组.

  3. 对于数组中的每个条目,调用上面的函数并传入当前条目.您将获得链接的ABPersonRef对象列表.从"finalContacts"数组中删除所有这些条目.

  4. 迭代后,应从"finalContacts"中删除所有链接的卡片,并留下唯一的地址簿卡列表.