2012-10-23 14 views
6

In meinem Code benutze ich ABPeoplePickerNavigationController, um eine Person auszuwählen. Nachdem der Benutzer wählen Person aus der Kontaktliste, sehe ich, wenn bestimmte Person Datensatz jede Telefonnummer haben:iOS 6 Adressbuch leer KABPersonPhoneProperty

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

Ich habe Kontakt aufgenommen Telefonnummer zu ihm und meinen Code getestet. In iOS 5 funktioniert dieser Code gut. Telefone Variable enthält eine Telefonnummer.

Aber in iOS 6, nach der Verknüpfung von Kontakt zu Facebook-Konto, Telefone Variable enthält keine Werte.

Nach dem Aufheben der Verbindung mit Facebook Konto funktioniert alles wieder gut.

Wie kann ich Telefonnummern dieser Methode lesen?

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

UPD

Wenn i JA in der obigen Funktion zurück, dann in Funktion

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

ich alle Person Telefonnummern in normaler Art und Weise lesen. Warum kann ich sie nicht in der ersten Funktion lesen?

+0

Ich denke, dieses Tutorial wird Ihnen helfen. http://blog.slaunchaman.com/2009/01/21/cocoa-touch-tutorial-extract-address-book-address-values-on-iphone-os/ –

+0

mit dem gleichen Problem. Irgendein Fortschritt? – aryehs

Antwort

9

Ich habe die Antwort auf meine Frage gefunden. Wenn der Kontakt verknüpft ist, dann wird in Verfahren

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

empfangen Sie einen Verweis auf Personen, die einen verknüpften Kontakt respesents. Um alle Telefonnummern abzurufen, müssen Sie alle verknüpften Kontakte abrufen und dann nach Telefonnummern in diesen Kontakten suchen. Ich tue dies mit dem folgenden Code:

- (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 ... 

} 

Mit diesem Code i für verknüpften Kontakt alle Telefonnummern empfangen.

+3

Ich bin überrascht, dass der statische Analysator nicht alle Lecks in diesem Snippet hervorhebt. – Abizern

0

In der Lösung re: verknüpfte Kontakte müssen Sie die Zeile ändern, die die Telefonnummern zu

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

, so dass Sie die ‚Telefone‘ später gefunden speichert können durch Etikett überprüfen. Die angegebene Lösung speichert nur die Zahlen, so dass Sie nicht gegen Konstanten wie kABPersonPhoneMainLabel

testen können Dieser Ansatz wird auch für E-Mails und Adressen verwendet. Für Adressen ziehen Sie die Teile wie folgt aus: -

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