Получение объединенных / унифицированных записей из ABAddressBook - PullRequest
18 голосов
/ 01 ноября 2010

Я разрабатываю приложение, которое показывает контакты iPhone.

ABAddressBookRef возвращает дубликаты записей для контакта, который появляется только один раз в приложении контактов iPhone.

Если посмотреть на карточку контакта (из контактов iPhone), внизу есть раздел, который называется«Связанные контакты», очевидно, яблоко «объединяет» / «объединяет» эти две записи в одну, которую я вижу.

Вопрос здесь в том, каков наилучший способ имитировать такое же поведение, чтобы мое приложение показывало только однузапись?есть ли API, который возвращает объединенные / объединенные записи из адресной книги?

Ответы [ 2 ]

26 голосов
/ 08 апреля 2012

Чтобы создать список контактов, которые объединяются в связанные контакты:

Примечание. Ссылки 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];
7 голосов
/ 24 сентября 2011

Вам нужно взглянуть на функцию с именем:

CFArrayRef ABPersonCopyArrayOfAllLinkedPeople (ABRecordRef person);

Эта функция определена в ABPerson.h.Вы передаете ABRecordRef для человека, и функция возвращает массив объектов ABRecordRef, представляющих карточки адресной книги, которые связаны с человеком, которого вы передали.

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

  2. Выполните итерации по исходному массиву контактов.

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

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

...