【问题标题】:Find a "work" email address for a person in iPhone Address Book?在 iPhone 通讯录中查找某人的“工作”电子邮件地址?
【发布时间】:2010-01-22 19:57:39
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: iphone email addressbook


    【解决方案1】:

    使用 ABMultiValueCopyLabelAtIndex 检查 kABWorkLabel 的标签。

    例如,如果您有一个名为“person”的 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);
    

    【讨论】:

    • 只是为了压缩响应,这里的秘密是kABWorkLabel,它会得到一个工作地址。请注意,您的代码可能存在泄漏问题,因为可能有许多工作电子邮件地址,因此 emailAddress 应该在设置之前释放,或者您需要跳出循环,或者(更好)您需要吐出一个工作电子邮件地址数组。
    • 好点。我从我的应用程序中获取了这个,实际上我正在设置一个属性(没有泄漏),我只关心获得一个。
    • 如果设置了多个电子邮件地址但未分配工作标签,则上述代码将失败。如果设置了多个地址但标签丢失,它也会失败,因为 CFStringCompare 会崩溃。不过感谢您发布此内容!
    • @MartinReichl 我想我通过在使用前添加标签检查修复了崩溃。你发现的第一个问题是什么?只是它没有找到电子邮件还是有错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2016-09-16
    • 2016-11-17
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多