tutorial programación objective lenguaje example caracteristicas objective-c ios4 linked-list contacts addressbook

programación - objective-c++



Obtención de entradas fusionadas/unificadas de ABAddressBook (2)

Estoy desarrollando una aplicación que está mostrando los contactos del iPhone.

ABAddressBookRef devuelve entradas duplicadas para un contacto que aparece solo una vez en la aplicación de contactos del iPhone.

Mirando en la tarjeta de contacto (de los contactos del iPhone), en la parte inferior hay una sección llamada "Contactos vinculados", por lo que obviamente Apple "fusiona" / "unifica" estas dos entradas en la que veo.

La pregunta aquí es ¿cuál es la mejor manera de imitar el mismo comportamiento para que mi aplicación muestre solo una entrada? ¿hay alguna API que devuelva las entradas unidas / unificadas de la libreta de direcciones?


Necesitas echar un vistazo a una función llamada:

CFArrayRef ABPersonCopyArrayOfAllLinkedPeople (persona ABRecordRef);

Esta función se define en ABPerson.h. Usted pasa un ABRecordRef para una persona y la función devuelve una matriz de objetos ABRecordRef que representan las tarjetas de la libreta de direcciones que están vinculadas a la persona que usted ingresó.

  1. Haga una copia mutable de la matriz que contiene las entradas de la libreta de direcciones que se devolvieron de ABAddressBookRef. Por el bien de la discusión, llame a esta nueva matriz "finalContacts".

  2. Iterar sobre la matriz original de contactos.

  3. Para cada entrada en la matriz, llame a la función anterior y pase la entrada actual. Obtendrá una lista de objetos ABPersonRef vinculados. Elimine todas estas entradas de la matriz "finalContacts".

  4. Después de la iteración, todas las tarjetas vinculadas deben eliminarse de "finalContacts" y debe quedar con una lista única de tarjetas de libreta de direcciones.


Para crear una lista de contactos que se fusiona en contactos vinculados:

Nota: las referencias de ABPerson se almacenan en instancias personalizadas de la clase Person . A continuación, todas las personas se almacenan en un diccionario addressDictionaryDiccionario utilizando el ID de registro de cada persona como clave.

1. Obtenga todos los ABPersons utilizando ABAddressBookCopyArrayOfAllPeople. Almacenar personas en la matriz allPersonRecords.

2. Iterar a través de todos los ABPersons.

2.1 Obtenga una lista de personas vinculadas para cada ABPerson. Utilizar

ABPersonCopyArrayOfAllLinkedPeople (persona ABRecordRef);

Si no hay contactos vinculados, este método devolverá una matriz que incluya a la persona como referencia. Entonces, si la matriz de retorno tiene un conteo> 1, la persona tiene contactos vinculados.

2.2 Agregar las personas vinculadas a un NSMutableSet. Estas personas vinculadas se omitirán y no se procesarán en futuras iteraciones.

2.3 Crear una instancia de persona para el ABPerson actual.

2.4 Combinar la información de la persona vinculada en la instancia de la persona. Una persona vinculada puede tener diferentes números de teléfono, por lo que debe combinarlos.

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];