Получение объединенных / унифицированных записей из 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, представляющих карточки адресной книги, которые связаны с человеком, которого вы передали.

  1. Создайте изменяемую копию массива, содержащего записи адресной книги, которые были возвращены из ABAddressBookRef. Ради обсуждения назовите этот новый массив "finalContacts".

  2. Переберите исходный массив контактов.

  3. Для каждой записи в массиве вызовите вышеуказанную функцию и передайте текущую запись. Вы получите список связанных объектов ABPersonRef. Удалите все эти записи из массива "finalContacts".

  4. После итерации все связанные карточки должны быть удалены из "finalContacts", и у вас должен остаться уникальный список карточек адресной книги.

Другие вопросы по тегам