在iPhone地址簿中查找某个人的“工作”电子邮件地址?

问题描述:

有没有办法从iPhone地址簿中找到某个人的特定类型的电子邮件地址?我知道如何获得一个人的所有电子邮件地址,而不知道如何识别它是什么类型的电子邮件地址(“家庭”,“工作”等)......也不是(这可能更可取),这是一种直接访问该地址的方法,无需遍历所有地址。在iPhone地址簿中查找某个人的“工作”电子邮件地址?

谢谢。

使用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