2010-01-22 5 views
5

Gibt es eine Möglichkeit, eine bestimmte Art von E-Mail-Adresse für eine Person aus dem iPhone-Adressbuch zu finden? Ich weiß, wie man alle E-Mail-Adressen für eine Person erhält, einfach nicht, wie man die Art der E-Mail-Adresse identifiziert ("Zuhause", "Arbeit", etc.) ... oder (und das ist vielleicht vorzuziehen)), eine Möglichkeit, direkt auf diese Adresse zuzugreifen, ohne sie alle durchlaufen zu müssen.Suchen Sie nach einer "geschäftlichen" E-Mail-Adresse für eine Person im iPhone-Adressbuch?

Danke.

Antwort

15

Suchen Sie nach einem Label von kABWorkLabel mit ABMultiValueCopyLabelAtIndex.

Zum Beispiel, wenn Sie ein ABRecordRef namens „Person“ haben, dieser Code eine einzelne NSString gesetzt namens „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

einfach die Antwort zu kondensieren, hier ist das Geheimnis der kABWorkLabel, die aus bekommt eine Arbeitsadresse. Beachten Sie jedoch, dass Ihr Code ein potenzielles Leak-Problem aufweist, da es eine Reihe von geschäftlichen E-Mail-Adressen geben könnte. Daher sollte emailAddress entweder vor der Einstellung freigegeben werden oder Sie müssen aus der Schleife ausbrechen, oder (besser) müssen Sie eine ausspucken Reihe von geschäftlichen E-Mail-Adressen. –

+0

Gute Punkte. Ich nahm das von meiner App und ich stellte tatsächlich eine Eigenschaft ein (kein Leck) und ich sorge mich nur darum, einen zu bekommen. – gerry3

+1

Der obige Code schlägt fehl, wenn mehr als eine E-Mail-Adresse festgelegt ist, aber keine Arbeitsbeschriftung zugewiesen ist. Es schlägt auch fehl, wenn mehr als eine Adresse festgelegt ist, aber Etiketten fehlen, da CFStringCompare abstürzt. Trotzdem danke für das Posten! –