【发布时间】:2011-01-13 13:57:46
【问题描述】:
一些用户在他们的 iPhone 通讯录中有多个地址簿,这是由于他们建立了不同的同步连接,例如Exchange 服务器。
如何获得所有这些不同的通讯录?我有兴趣获取保存这些不同地址簿的名称并访问他们的联系信息。
谢谢!
【问题讨论】:
标签: iphone objective-c addressbook exchange-server
一些用户在他们的 iPhone 通讯录中有多个地址簿,这是由于他们建立了不同的同步连接,例如Exchange 服务器。
如何获得所有这些不同的通讯录?我有兴趣获取保存这些不同地址簿的名称并访问他们的联系信息。
谢谢!
【问题讨论】:
标签: iphone objective-c addressbook exchange-server
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) 获取源中的条目。
【讨论】:
iOS 上只有一个集中式地址簿数据库可由一组 C 函数访问,请参阅 ABAddressBook 和 iOS address book programming guide。
您可能指的是该通讯簿中的组。在这种情况下,您可以使用ABAddressBookCopyArrayOfAllGroups 函数获取组列表,如reference on ABGroup 中所述。
【讨论】:
ABAddressBookCopyArrayOfAllPeople 访问整个数据库。方法ABAddressBookCopyArrayOfAllPeopleInSource 是一个更受限制的版本,请参阅ABPerson 文档developer.apple.com/library/ios/#documentation/AddressBook/…