2012-10-23 2 views
6

Nel mio codice uso ABPeoplePickerNavigationController per selezionare la persona. Dopo utente selezionare persona dalla lista dei contatti, guardo se il record della persona specificata ha alcun numero di telefono:Rubrica iOS 6 vuota kABPersonPhoneProperty

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 
     ABMutableMultiValueRef phones; 
     phones = ABRecordCopyValue(person, kABPersonPhoneProperty); 
     if (phones == nil || ABMultiValueGetCount(phones) == 0) 
     { 
      return NO; 
     } 
     // other code.... 
} 

ho creato il contatto, ha aggiunto il numero di telefono ad esso e testato il mio codice. In iOS 5 questo codice funziona bene. numero di telefono variabile contiene un numero di telefono.

Ma in iOS 6, dopo aver collegato il contatto all'account facebook, la variabile telefoni non contiene alcun valore.

Dopo aver scollegato il contatto con l'account Facebook, tutto funziona correttamente.

Come posso leggere i numeri di telefono di questa persona?

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 

UPD

se torno SI nella funzione di cui sopra, quindi nella funzione

(BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 

posso leggere tutti i numeri di telefono persona in modo normale. Quindi, perché non riesco a leggerli nella prima funzione?

+0

penso che questo tutorial ti aiuterà. http://blog.slaunchaman.com/2009/01/21/cocoa-touch-tutorial-extract-ad-ress-book-ad-ress-values-on-iphone-os/ –

+0

aventi lo stesso problema. Qualche progresso? – aryehs

risposta

9

Ho trovato la risposta alla mia domanda. Se il contatto è collegato, poi nel metodo

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 

si riceve un riferimento a persona, che respesents un contatto collegato. Per recuperare tutti i numeri di telefono è necessario ottenere tutti i contatti collegati e quindi cercare i numeri di telefono in tali contatti. Lo faccio con il seguente codice:

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 

ABMutableMultiValueRef phones; 
phones = ABRecordCopyValue(person, kABPersonPhoneProperty); 
if (phones == nil || ABMultiValueGetCount(phones) == 0) 
{ 
    CFArrayRef linkedContacts = ABPersonCopyArrayOfAllLinkedPeople(person); 
    phones = ABMultiValueCreateMutable(kABPersonPhoneProperty); 
    ABMultiValueRef linkedPhones; 
    for (int i = 0; i < CFArrayGetCount(linkedContacts); i++) 
    { 
     ABRecordRef linkedContact = CFArrayGetValueAtIndex(linkedContacts, i); 
     linkedPhones = ABRecordCopyValue(linkedContact, kABPersonPhoneProperty); 
     if (linkedPhones != nil && ABMultiValueGetCount(linkedPhones) > 0) 
     { 
      for (int j = 0; j < ABMultiValueGetCount(linkedPhones); j++) 
      { 
       ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j), NULL, NULL); 
      } 
     } 
     CFRelease(linkedPhones); 
    } 
    CFRelease(linkedContacts); 

    if (ABMultiValueGetCount(phones) == 0) 
    { 
     CFRelease(phones); 
     return NO; 
    } 
} 
// other code ... 

} 

Con questo codice ho ricevuto tutti i numeri di telefono per contatto collegato.

+3

Sono sorpreso che l'analizzatore statico non stia evidenziando tutte le perdite in questo frammento. – Abizern

0

Nella soluzione Re: contatti collegati è necessario modificare la riga che memorizza i numeri di telefono trovati a

ABMultiValueAddValueAndLabel(phones, ABMultiValueCopyValueAtIndex(linkedPhones, j), 
    ABMultiValueCopyLabelAtIndex(linkedPhones, j), NULL); 

in modo da poter utilizzare i telefoni '' per verificare dall'etichetta tardi. La soluzione data memorizza solo i numeri in modo da non essere in grado di testare costanti come kABPersonPhoneMainLabel

Questo approccio è utilizzato anche per e-mail e indirizzi. Per gli indirizzi si estrae le parti in questo modo: -

CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(address, 0); 
street.text = CFBridgingRelease(CFDictionaryGetValue(dict, kABPersonAddressStreetKey));