【问题标题】:ABAddressBook ABSource and ABSourceTypeABAddressBook ABSource 和 ABSourceType
【发布时间】:2011-03-07 17:01:54
【问题描述】:

我正在尝试创建一个可用于搜索 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 框架的新概念,我认为人们对此没有多少经验,但希望有人可以帮助我了解如何使用上述内容...谢谢。

【问题讨论】:

  • 嘿,你有没有找到一个解决方案来让你搜索 GAL?我在这个圈子里转了一圈,似乎没有任何答案。在这里查看我的新问题:stackoverflow.com/questions/17566267/…

标签: iphone exchange-server abaddressbook


【解决方案1】:

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

例如

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 类型,因此你可以像任何其他记录一样与它进行交互。

【讨论】:

  • 这使您能够找到源,但是您可以用源做什么呢?有没有办法在源中搜索联系人,例如OP 中的“Smi”,返回“John Smith”等
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    Mixja 回复更新

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

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

    最终代码应如下所示:

    确保包含第 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多