Получение объединенных / унифицированных записей из ABAddressBook
Я разрабатываю приложение, которое показывает контакты iPhone.
ABAddressBookRef возвращает дубликаты записей для контакта, который появляется только один раз в приложении контактов iPhone.
Глядя на карточку контакта (из контактов iPhone), внизу есть раздел "Связанные контакты", так что, очевидно, яблоко "объединяет"/"объединяет" эти две записи в одну, которую я вижу.
Вопрос в том, каков наилучший способ имитировать такое же поведение, чтобы мое приложение показывало только одну запись? есть ли API, который возвращает объединенные / унифицированные записи из адресной книги?
2 ответа
Чтобы создать список контактов, которые объединяются в связанные контакты:
Примечание. Ссылки ABPerson хранятся в пользовательских экземплярах класса Person. Все люди затем сохраняются в словаре addressBookDictionary с использованием recordID каждого человека в качестве ключа.
1. Получить всех ABPersons, используя ABAddressBookCopyArrayOfAllPeople. Хранить персон в массиве allPersonRecords.
2. Переберите всех ABPersons.
2.1 Получить список связанных лиц для каждого ABPerson. использование
ABPersonCopyArrayOfAllLinkedPeople(ABRecordRef person);
Если нет связанных контактов, этот метод вернет массив, включающий человека, который ссылается на себя. Таким образом, если возвращаемый массив имеет число> 1, у человека есть связанные контакты.
2.2 Добавьте связанных лиц в NSMutableSet. Эти связанные лица будут пропущены и не будут обработаны в будущих итерациях.
2.3 Создать экземпляр Person для текущего ABPerson.
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];
Вам нужно взглянуть на функцию с именем:
CFArrayRef ABPersonCopyArrayOfAllLinkedPeople (ABRecordRef person);
Эта функция определена в ABPerson.h. Вы передаете ABRecordRef для человека, и функция возвращает массив объектов ABRecordRef, представляющих карточки адресной книги, которые связаны с человеком, которого вы передали.
Создайте изменяемую копию массива, содержащего записи адресной книги, которые были возвращены из ABAddressBookRef. Ради обсуждения назовите этот новый массив "finalContacts".
Переберите исходный массив контактов.
Для каждой записи в массиве вызовите вышеуказанную функцию и передайте текущую запись. Вы получите список связанных объектов ABPersonRef. Удалите все эти записи из массива "finalContacts".
После итерации все связанные карточки должны быть удалены из "finalContacts", и у вас должен остаться уникальный список карточек адресной книги.