2010-11-01 13 views
18

Sto sviluppando un'applicazione che mostra i contatti iPhone.Ottenere le voci unite/unificate da ABAddressBook

L'ABAddressBookRef restituisce voci duplicate per un contatto visualizzato una sola volta nell'applicazione per i contatti iPhone.

Guardando la scheda di contatto (dai contatti iPhone), in basso c'è una sezione chiamata "Contatti collegati" quindi ovviamente Apple "unisci"/"unifica" queste due voci in quella che vedo.

La domanda qui è qual è il modo migliore per simulare lo stesso comportamento così la mia app mostrerà solo una voce? c'è un'API che restituisce le voci unite/unificate dalla rubrica?

risposta

26

Per creare un elenco di contatti che si fonde in contatti collegati:

Nota: i riferimenti ABPerson sono memorizzati in costume persona istanze di classe. Tutte le persone vengono quindi memorizzate in un dizionario addressBookDictionary utilizzando recordID di ogni persona come chiave.


1. Ottenere tutti ABPersons utilizzando ABAddressBookCopyArrayOfAllPeople. Memorizzare le persone in tutto l'array di PersonersonRecords.

2. Passare attraverso tutti gli ABer.


2,1 ottenere un elenco di persone legate per ogni ABPerson. Utilizzare

ABPersonCopyArrayOfAllLinkedPeople (persona ABRecordRef);

Se non ci sono contatti collegati, questo metodo restituirà un array che include la persona di riferimento. Quindi se l'array di restituzione ha un conteggio> 1, la persona ha dei contatti collegati.

2.2 Aggiungere le persone collegate a un NSMutableSet. Queste persone collegate verranno saltate e non elaborate in iterazioni future.

2.3 Creare un'istanza Persona per l'ABPerson corrente.

2.4 Unire le informazioni di persone collegate in istanza di Person. Una persona collegata può avere numeri di telefono diversi, quindi è necessario unirli insieme.


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

ciao, puoi descrivere quale classe Person contiene nel tuo codice? – HarshIT

+1

sì, mi piacerebbe usare questa classe, ma come posso ottenerla? – khaled

+0

Descrivi - La classe della persona non trovata .. @MinTsai –

7

È necessario avere uno sguardo a una funzione denominata:

CFArrayRef ABPersonCopyArrayOfAllLinkedPeople (ABRecordRef persona);

Questa funzione è definita in ABPerson.h. Si passa in un ABRecordRef per una persona e la funzione restituisce un array di oggetti ABRecordRef che rappresentano le schede della rubrica che sono collegati alla persona che avete passato in.

  1. Eseguire una copia mutabile della matrice contenente la rubrica voci che sono state restituite da ABAddressBookRef. Per motivi di discussione, chiama questo nuovo array "finalContacts".

  2. Iterate sull'array originale di contatti.

  3. Per ciascuna voce dell'array, chiamare la funzione sopra riportata e passare la voce corrente. Verrà visualizzato un elenco di oggetti ABPersonRef collegati. Rimuovi tutte queste voci dalla matrice "finalContacts".

  4. Dopo l'iterazione, tutte le schede collegate devono essere rimosse da "finalContacts" e si dovrebbe lasciare un elenco univoco di schede di rubrica.

+0

suona abbastanza giusto .. ma forse dovremmo dare un'occhiata a ciò che i contatti collegati è buono per? – hfossli

+0

rimuovendo anche "mom", "assistent" e altri link da visualizzare nell'elenco suoni strani .. (?) – hfossli

+0

@hfossli: 'ABPersonCopyArrayOfAllLinkedPeople (person)' restituisce una serie di altri record per la stessa persona. I collegamenti a Sposo, Assistente, ecc. Vengono restituiti da 'ABRecordCopyValue (person, kABPersonRelatedNamesProperty)'. –

Problemi correlati