2010-01-22 8 views
5

Czy istnieje sposób na znalezienie konkretnego rodzaju adresu e-mail dla osoby z Książki adresowej iPhone'a? Wiem, jak uzyskać wszystkie adresy e-mail dla danej osoby, po prostu nie wiem, jak rozpoznać adres e-mail ("dom", "praca" itp.) ... ani (i to może być lepsze), sposób na bezpośredni dostęp do tego adresu bez konieczności powtarzania ich wszystkich.Znajdź "służbowy" adres e-mail osoby w Książce adresowej iPhone'a?

Dzięki.

Odpowiedz

15

Sprawdź etykietę kABWorkLabel za pomocą ABMultiValueCopyLabelAtIndex.

Na przykład, jeśli masz ABRecordRef nazwie „osoby”, to kod będzie ustawiony pojedynczy NSString nazwie „emailAddress”:

// Email address (if only one, use it; otherwise, use the first work email address) 
CFStringRef value, label; 
ABMutableMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); 
CFIndex count = ABMultiValueGetCount(multi); 
if (count == 1) { 
    value = ABMultiValueCopyValueAtIndex(multi, 0); 
    emailAddress = (NSString*)value; 
    [emailAddress retain]; 
    CFRelease(value); 
} else { 
    for (CFIndex i = 0; i < count; i++) { 
     label = ABMultiValueCopyLabelAtIndex(multi, i); 
     value = ABMultiValueCopyValueAtIndex(multi, i); 

     // check for Work e-mail label 
     if (label && CFStringCompare(label, kABWorkLabel, 0) == 0) { 
      emailAddress = (NSString*)value; 
      [emailAddress retain]; 
      break; 
     } 

     CFRelease(label); 
     CFRelease(value); 
    } 
} 
CFRelease(multi); 
+3

Wystarczy skrapla odpowiedź, sekretem jest tu kABWorkLabel który wysiada adres służbowy. Zauważ, że Twój kod ma potencjalny problem z wyciekiem, ponieważ może istnieć wiele roboczych adresów e-mail, więc adres e-mail powinien zostać zwolniony przed ustawieniem lub musisz wyjść z pętli lub (lepiej) musisz wypluć tablica roboczych adresów e-mail. –

+0

Dobre punkty. Wziąłem to z mojej aplikacji i faktycznie ustawiałem nieruchomość (bez wycieku) i zależy mi tylko na jej zdobyciu. – gerry3

+1

powyższy kod kończy się niepowodzeniem, jeśli ustawiono więcej niż jeden adres e-mail, ale nie przypisano etykiety roboczej. nie powiedzie się, jeśli ustawiono więcej niż jeden adres, ale brakuje etykiet, ponieważ CFStringCompare ulegnie awarii. Niemniej jednak dziękuję za opublikowanie tego! –

Powiązane problemy