iPhone通讯簿:列出来源和帐户

iPhone通讯簿:列出来源和帐户,iphone,addressbook,Iphone,Addressbook,我需要选择我的应用程序在其中创建联系人的通讯簿源 在Contacts应用程序中,当我选择“

我需要选择我的应用程序在其中创建联系人的通讯簿源

在Contacts应用程序中,当我选择“
  • 所有联系人
  • 移动式
    • 全手机
    • 公司
    • 家族
    • 朋友
  • 顶点交换
    • ACME Exchange全局地址列表
  • 测试卡
    • 通讯录
    • 搜寻
使用函数abAddressBookCopyArrayFallSources我可以获取

  • 没有名字;类型:kABSourceTypeMobileMe
  • 没有名字;类型:kABSourceTypeExchangeGAL
  • “通讯录”;类型:kABSourceTypeCardDAV
  • “搜索”;类型:kABSourceTypeCardDAVSearch
这些名称不是描述性的,我想在显示源名称或类型的同时显示帐户名称,就像联系人应用程序一样

您知道如何查找源的帐户名,或检索所有现有帐户名和每个帐户的源吗?获取更多描述性条目还有其他想法吗?

这可能会有帮助:

iOS 4+提供了新的API,允许用户从
ABAddressBook
中选择特定的
ABSource
。这可能很有用,因为某些源(如Exchange)不支持某些操作,例如创建
ABGroup

“并非所有源类型都支持组,更明显的是,Exchange对组一无所知。”


它展示了如何使用函数来利用新的API来获取特定类型的源,这些源可能用于调用
ABGroupCreateInSource()
,这看起来就是您想要的。

从iOS 5.1开始,没有用于此的公共API

人们希望
ABRecordCopyCompositeName()
能够得到您想要的东西-它为个人和组记录提供了“人性化”的名称-但遗憾的是,它返回null

正如格雷厄姆指出的(在提供赏金时),直接要求
kABSourceNameProperty
提供了错误的答案

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook);

CFIndex i, c = CFArrayGetCount(sources);
ABRecordRef curSource;

// Log each source name.
for (i=0; i<c; i++) {
    curSource = CFArrayGetValueAtIndex(sources, i);
    NSString *name = (__bridge_transfer NSString *)ABRecordCopyCompositeName(curSource);
    NSLog(@"Alas this is null: %@", name);


    NSString *directValue = (__bridge_transfer NSString *)ABRecordCopyValue(curSource,kABSourceNameProperty);
    NSLog(@"And direct access gives wrong answer: %@", directValue);

}

CFRelease(sources);
CFRelease(addressBook);
ABAddressBookRef addressBook=ABAddressBookCreate();
CFArrayRef sources=abAddressBookCopyArrayFallSources(addressBook);
CFIndex i,c=CFArrayGetCount(来源);
ABRecordRef curSource;
//记录每个源名称。

对于(i=0;iDid您知道如何列出帐户名吗?例如,在您的示例中:ACME Exchange或Test CardDav谢谢,不幸的是,
ABRecordCopyCompositeName()
的文档包括“此函数的行为没有为源记录定义”。因此我不希望它工作:-(