【问题标题】:iPhone: How do you get the names of all the address books on the iPhone?iPhone:你如何得到 iPhone 上所有通讯录的名字?
【发布时间】:2011-01-13 13:57:46
【问题描述】:

一些用户在他们的 iPhone 通讯录中有多个地址簿,这是由于他们建立了不同的同步连接,例如Exchange 服务器。

如何获得所有这些不同的通讯录?我有兴趣获取保存这些不同地址簿的名称并访问他们的联系信息。

谢谢!

【问题讨论】:

    标签: iphone objective-c addressbook exchange-server


    【解决方案1】:
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef sourcesArray = ABAddressBookCopyArrayOfAllSources(addressBook);
    for (CFIndex i = 0; i < CFArrayGetCount(sourcesArray); i++) {
        ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(sourcesArray, i);
        ABRecordID sourceID = ABRecordGetRecordID(source);
        CFNumberRef sourceType = (CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty);
        CFStringRef sourceName = (CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty);
        NSLog(@"source id=%d type=%d name=%@", sourceID, [(NSNumber *)sourceType intValue], sourceName);
        CFRelease(sourceType);
        if (sourceName != NULL) CFRelease(sourceName); // some source names are NULL
    }
    CFRelease(sourcesArray);
    CFRelease(addressBook);
    

    请注意,从 iOS 4 开始,并非所有源都返回名称。您可以根据类型提供自己的名称。

    使用ABAddressBookCopyArrayOfAllPeopleInSource(addressBook, source) 获取源中的条目。

    【讨论】:

    • 我在 CFRelease(sourceType) 上崩溃了 - 使用 ARC。
    • ABAddressBookCreate() 不推荐使用 ABAddressBookCreateWithOptions(NULL, NULL) 代替
    【解决方案2】:

    iOS 上只有一个集中式地址簿数据库可由一组 C 函数访问,请参阅 ABAddressBookiOS address book programming guide

    您可能指的是该通讯簿中的组。在这种情况下,您可以使用ABAddressBookCopyArrayOfAllGroups 函数获取组列表,如reference on ABGroup 中所述。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2012-12-12
    • 2011-03-12
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多