我正在开发一个显示iPhone联系人的应用程序。
ABAddressBookRef返回在iPhone联系人应用程序中仅出现一次的联系人的重复条目。
查看联系人卡片(来自iPhone联系人),在底部有一个名为“链接联系人”的部分,所以很明显苹果“合并”/“统一”这两个条目到我看到的那个。
这里的问题是模仿相同行为的最佳方式是什么,以便我的应用只显示一个条目?是否有一个API从地址簿中返回合并/统一的条目?
答案 0 :(得分:26)
创建在链接的联系人中合并的联系人列表:
注意:ABPerson引用存储在自定义 Person 类实例中。然后将所有人存储在字典 addressBookDictionary 中,使用每个人的 recordID 作为密钥。
<强> 1。使用ABAddressBookCopyArrayOfAllPeople获取所有ABPersons。将人员存储在allPersonRecords数组中。
<强> 2。迭代所有ABPersons。
2.1获取每个ABPerson的链接人员列表。使用
ABPersonCopyArrayOfAllLinkedPeople(ABRecordRef person);
如果没有链接的联系人,此方法将返回一个数组,其中包括人员引用他/她自己。因此,如果返回数组的计数> 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];
答案 1 :(得分:7)
您需要查看名为的函数:
CFArrayRef ABPersonCopyArrayOfAllLinkedPeople(ABRecordRef person);
此功能在ABPerson.h中定义。您为一个人传入ABRecordRef,该函数返回一个ABRecordRef对象数组,表示链接到您传入的人的地址簿卡。
制作包含从ABAddressBookRef返回的地址簿条目的数组的可变副本。为了便于讨论,请将此新数组称为“finalContacts”。
迭代原始联系人数组。
对于数组中的每个条目,调用上面的函数并传入当前条目。您将获得链接的ABPersonRef对象列表。从“finalContacts”数组中删除所有这些条目。
迭代后,应从“finalContacts”中删除所有链接的卡片,并留下唯一的地址簿卡列表。