2010-01-22 136 views
5

有沒有辦法從iPhone地址簿中找到某個人的特定類型的電子郵件地址?我知道如何獲得一個人的所有電子郵件地址,而不知道如何識別它是什麼類型的電子郵件地址(「家庭」,「工作」等)......也不是(這可能更可取),這是一種直接訪問該地址的方法,無需遍歷所有地址。在iPhone地址簿中查找某個人的「工作」電子郵件地址?

謝謝。

回答

15

使用ABMultiValueCopyLabelAtIndex檢查kABWorkLabel的標籤。

舉例來說,如果你有一個ABRecordRef命名爲「人」,這個代碼將設置爲「EMAILADDRESS」單一的NSString:

// 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

剛剛凝結的響應,祕密在這裏是得到了kABWorkLabel一個工作地址。請注意,儘管您的代碼存在潛在的泄漏問題,因爲可能會有多個工作電子郵件地址,所以應該在設置之前發佈emailAddress,或者您需要跳出循環,或者(更好)您需要吐出工作電子郵件地址列表。 – 2010-01-22 20:56:22

+0

好點。我從我的應用程序中獲取了這個信息,實際上我正在設置一個屬性(不泄漏),我只關心一個屬性。 – gerry3 2010-01-22 20:58:31

+1

如果設置了多個電子郵件地址但未分配工作標籤,則上述代碼將失敗。如果設置了多個地址但標籤丟失,它也會失敗,因爲CFStringCompare會崩潰。不過謝謝發佈! – 2012-04-20 10:05:28