Подтвердить что ты не робот

Получение объединенных/унифицированных записей из ABAddressBook

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

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

Глядя на карточку контакта (из контактов iPhone), внизу находится раздел "Связанные контакты", так что очевидно, что "слияние" / "объединение" этих двух записей в один я вижу.

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

4b9b3361

Ответ 1

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

Примечание. Ссылки ABPerson хранятся в пользовательских экземплярах класса Person. Затем все люди хранятся в словаре addressBookDictionary, используя recordID каждого человека в качестве ключа.


1. Получите все ABPersons, используя ABAddressBookCopyArrayOfAllPeople. Храните людей в массиве allPersonRecords.

2. Итерации через все ABPersons.


2.1 Получите список связанных лиц для каждого ABPerson. Используйте

ABPersonCopyArrayOfAllLinkedPeople (пользователь ABRecordRef);

Если нет связанных ссылок, этот метод вернет массив, включая ссылку на человека. Поэтому, если у возвращаемого массива есть счетчик > 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];

Ответ 2

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

CFArrayRef ABPersonCopyArrayOfAllLinkedPeople (пользователь ABRecordRef);

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

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

  • Итерации по исходному массиву контактов.

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

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