我正在开发一个显示iPhone联系人的应用程序。
ABAddressBookRef对于在iPhone联系人应用程序中仅出现一次的联系人返回重复条目。
查看联系人卡片(来自iPhone联系人),底部有一个名为“已链接联系人”的部分,因此显然苹果将这两个条目“合并” / “统一”成为我看到的一个条目。
问题在于如何模仿相同的行为,以便我的应用程序只显示一个条目? 是否有一个API可以从地址簿返回已合并/统一的条目?
我正在开发一个显示iPhone联系人的应用程序。
ABAddressBookRef对于在iPhone联系人应用程序中仅出现一次的联系人返回重复条目。
查看联系人卡片(来自iPhone联系人),底部有一个名为“已链接联系人”的部分,因此显然苹果将这两个条目“合并” / “统一”成为我看到的一个条目。
问题在于如何模仿相同的行为,以便我的应用程序只显示一个条目? 是否有一个API可以从地址簿返回已合并/统一的条目?
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];
您需要查看一个名为:
CFArrayRef ABPersonCopyArrayOfAllLinkedPeople(ABRecordRef person);
这个函数在ABPerson.h中定义。您向该函数传递一个人的ABRecordRef,该函数将返回一个ABRecordRef对象数组,表示链接到您传入的人的通讯录卡。
对于从ABAddressBookRef返回的包含通讯录条目的数组,进行可变复制。为了讨论,将新数组称为“finalContacts”。
遍历联系人的原始数组。
对于数组中的每个条目,请调用上面的函数并传递当前条目。 您将得到一个链接的ABPersonRef对象列表。 从“finalContacts”数组中删除所有这些条目。
迭代后,“finalContacts”应删除所有链接的卡,并且您应该留下唯一的通讯录卡列表。
ABPersonCopyArrayOfAllLinkedPeople(person)
返回同一人的其他记录数组。 配偶,助手等链接由ABRecordCopyValue(person,kABPersonRelatedNamesProperty)
返回。 - David Hull