2012-10-23 9 views
6

W moim kodzie używam ABPeoplePickerNavigationController do wyboru osoby. Po użytkownikowi wybrać osobę z listy kontaktów, patrzę, czy określona osoba rekord mieć dowolny numer telefonu:Książka adresowa iOS 6 pusta kABPersonPhoneProperty

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

Stworzyłem kontakt, dodaje do niego numer telefonu i przetestowane mój kod. W iOS 5 ten kod działa dobrze. telefony zmienna zawiera jeden numer telefonu.

Ale w iOS 6, po połączeniu kontaktu z kontem facebook, telefony zmienna nie zawiera żadnych wartości.

Po rozłączeniu kontaktu z kontem na Facebooku wszystko znów działa dobrze.

Jak mogę odczytać numery telefonów osób tą metodą?

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

UPD

Jeśli wrócę TAK w funkcji powyżej, a następnie w zależności

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

mogę odczytać wszystkie numery telefonów osoba w normalny sposób. Dlaczego więc nie mogę ich odczytać w pierwszej funkcji?

+0

Myślę, że ten samouczek Ci pomoże. http://blog.slaunchaman.com/2009/01/21/cocoa-touch-tutorial-extract-address-book-address-values-on-iphone-os/ –

+0

o tym samym problemie. Jakiś postęp? – aryehs

Odpowiedz

9

Znalazłem odpowiedź na moje pytanie. Jeśli kontakt jest powiązany, a następnie w metodzie

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

Państwo otrzymywać odniesienie do osoby, która respesents połączonego kontaktu. Aby pobrać wszystkie numery telefonów, musisz uzyskać wszystkie połączone kontakty, a następnie wyszukać numery telefonów w tych kontaktach. to zrobić za pomocą następującego kodu:

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

} 

Z tym kodem Otrzymałem wszystkie numery telefonów dla połączonego kontaktu.

+3

Jestem zaskoczony, że analizator statyczny nie podkreśla wszystkich wycieków w tym fragmencie. – Abizern

0

W temacie rozwiązanie: Połączone kontakty trzeba zmienić linię, która przechowuje numery telefonów znalezione na

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

, dzięki czemu można korzystać z „telefony” to sprawdzić przez wytwórnię później. Podane rozwiązanie zapisuje tylko liczby, więc nie można przetestować na podstawie stałych takich jak kABPersonPhoneMainLabel

To podejście jest również stosowane w przypadku wiadomości e-mail i adresów. W przypadku adresów możesz wyciągnąć takie części: -

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