ABAddressBook ABSource和ABSourceType

时间:2010-06-24 08:49:34

标签: iphone exchange-server abaddressbook

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

来源类型

这些常量标识源的类型。

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框架的一个新概念,我不认为人们对此有很多经验,但希望有人可以帮助我理解如何使用上述...谢谢。

3 个答案:

答案 0 :(得分:7)

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

e.g。

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];
}

请注意,如果您设置了多个“Exchange”帐户,则会获得具有相同ABSourceType的多个来源。不幸的是,在我的有限测试中,Exchange GAL的kABSourceTypeNameProperty为NULL,因此您无法使用此属性来区分多个Exchange GAL源。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

更新Mixja的回复

  1. ABAddressBookCreate()已被弃用。在接口中声明引用:
    • 另外,请删除:addressBook = ABAddressBookCreate();
  2. 更新sourceTypeRef&amp;的声明sourceTypeName:
  3. 将发布方法调用更改为:

    // 1.
    @property(nonatomic, assign) 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 CFTypeRef)(sourceTypeName));
    
  4. 最终代码应如下所示:

    确保包含第1步!

        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));