首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ABAddressBook ABSource和ABSourceType

ABAddressBook ABSource和ABSourceType
EN

Stack Overflow用户
提问于 2010-06-24 16:49:34
回答 3查看 5.9K关注 0票数 6

我正在尝试创建一个可以用来搜索Exchange GAL的应用程序,然而,我发现关于这个主题的新的4.0文档令人困惑。有谁知道我如何在GAL中搜索包含特定字符串的名称(例如"Smi")?我的源代码目前几乎是无用的,因为我只是试图绕过我的头脑,如何指定我只想搜索GAL而不是设备上的本地联系人。另外,kABSourceTypeSearchableMask是如何使用的?我在这里遗漏了一些基本的东西。从文档..。

源类型

这些常量用于标识源的类型。

代码语言:javascript
复制
enum {
    kABSourceTypeLocal       = 0x0,
    kABSourceTypeExchange    = 0x1,
    kABSourceTypeExchangeGAL = kABSourceTypeExchange | kABSourceTypeSearchableMask,
    kABSourceTypeMobileMe    = 0x2,
    kABSourceTypeLDAP        = 0x3 | kABSourceTypeSearchableMask,
    kABSourceTypeCardDAV     = 0x4,
    kABSourceTypeCardDAVSearch = kABSourceTypeCardDAV | kABSourceTypeSearchableMask,
};
typedef int ABSourceType;

当我查询缺省的源类型时,我得到的是"1“,它表明缺省类型是"kABSourceTypeExchange”,这是正确的,因为这就是我在设置中的设置。我不知道如何超越这一点..。

由于整个源代码的概念对于4.0中的ABAddressBook框架来说是一个新的概念,我不认为人们对此有太多的经验,但希望有人能帮助我理解如何使用above...thanks。

EN

回答 3

Stack Overflow用户

发布于 2010-11-04 17:31:38

要访问Exchange,您需要使用函数ABAddressBookCopyArrayOfAllSources来获取所有源的数组,然后迭代该数组以尝试获取Exchange GAL的正确源。使用ABRecordCopyValue()函数获取源的kABSourceTypeProperty属性。

例如:

代码语言:javascript
复制
ABRecordRef searchableExchangeSource;

addressBook = ABAddressBookCreate();
CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources(addressBook);
for (CFIndex i = 0; i < CFArrayGetCount(allSources); i++) {
    ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(allSources, i);

    // Get source properties
    NSNumber *sourceTypeRef = (NSNumber *)((CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty));
    NSString *sourceTypeName = (NSString *)((CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty));
    int sourceType = [sourceTypeRef intValue];
    NSLog(@"Found Source Type: %@ with ABSourceType %i", sourceTypeName,sourceType);
    if (sourceType == kABSourceTypeExchangeGAL) {
        searchableExchangeSource = source;
    }
    [sourceTypeRef release];
    [sourceTypeName release];
}

注意:如果您设置了多个“交换”帐户,您将获得具有相同ABSourceType的多个源。不幸的是,根据我有限的测试,Exchange GAL的kABSourceTypeNameProperty为空,因此您不能使用此属性来区分多个Exchange GAL源。

一旦有了合适的源,它的类型就是ABRecordRef,因此您可以像处理任何其他记录一样与它进行交互。

票数 7
EN

Stack Overflow用户

发布于 2011-01-25 17:07:00

我在这里发布了一些代码:Obtaining Specific ABSource from ABAddressBook in iOS 4+

用于识别特定的来源。它可能有助于您了解如何使用ABAddressBook。

票数 1
EN

Stack Overflow用户

发布于 2014-03-28 18:19:11

Mixja的响应更新

  1. ABAddressBookCreate()已被弃用。在接口中声明一个引用:
    • 同时,删除:addressBook = ABAddressBookCreate();

  1. 更新sourceTypeRef & release方法调用的声明:

// 1. @property(非原子,赋值) ABAddressBookRef *addressBook;// 2. NSNumber *sourceTypeRef = (__bridge NSNumber *)((CFNumberRef)ABRecordCopyValue(source,kABSourceTypeProperty));NSString *sourceTypeName = (__bridge NSString *)((CFStringRef)ABRecordCopyValue(source,kABSourceNameProperty));// 3. CFRelease((__bridge CFTypeRef)(sourceTypeRef));CFRelease(__bridge

最终的代码应该如下所示:

请确保包含步骤1!

代码语言:javascript
复制
    ABRecordRef searchableExchangeSource;

    CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources(_addressBook);
    for (CFIndex i = 0; i < CFArrayGetCount(allSources); i++) {
    ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(allSources, i);

    // Get source properties
    NSNumber *sourceTypeRef = (__bridge NSNumber *)((CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty));
    NSString *sourceTypeName = (__bridge NSString *)((CFStringRef)ABRecordCopyValue(source, kABSourceNameProperty));
    int sourceType = [sourceTypeRef intValue];
    NSLog(@"Found Source Type: %@ with ABSourceType %i", sourceTypeName,sourceType);
    if (sourceType == kABSourceTypeExchangeGAL) {
        searchableExchangeSource = source;
    }
    CFRelease((__bridge CFTypeRef)(sourceTypeRef));
    CFRelease((__bridge CFTypeRef)(sourceTypeName));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3108413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档