3

有没有人有如何从 iOS 4+ 中的 ABAddressBook 获取特定 ABSource 的示例?

4

4 回答 4

9

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

“并非所有源类型都支持组,更明显的是,Exchange 对组一无所知。” - http://flavors.me/volonbolon#1a5/tumblr

附件是利用新 API 获取特定类型源的函数,这些源可用于调用 ABGroupCreateInSource()。

#define CFRELEASE_AND_NIL(x) CFRelease(x); x=nil;
ABRecordRef sourceWithType (ABSourceType mySourceType)
{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook);
    CFIndex sourceCount = CFArrayGetCount(sources);
    ABRecordRef resultSource = NULL;
    for (CFIndex i = 0 ; i < sourceCount; i++) {
        ABRecordRef currentSource = CFArrayGetValueAtIndex(sources, i);
        CFTypeRef sourceType = ABRecordCopyValue(currentSource, kABSourceTypeProperty);

        BOOL isMatch = mySourceType == [(NSNumber *)sourceType intValue];
        CFRELEASE_AND_NIL(sourceType);

        if (isMatch) {
            resultSource = currentSource;
            break;
        }
    }

    CFRELEASE_AND_NIL(addressBook);    
    CFRELEASE_AND_NIL(sources);

    return resultSource;
}

ABRecordRef localSource()
{
    return sourceWithType(kABSourceTypeLocal);
}

ABRecordRef exchangeSource()
{
    return sourceWithType(kABSourceTypeExchange);
}

ABRecordRef mobileMeSource()
{
    return sourceWithType(kABSourceTypeMobileMe);
}
于 2011-01-13T11:45:13.833 回答
2

真的很想知道如何创建自己的源。就像 Exchange 创建的组一样,您无需编辑默认源记录而是创建自己的组,最神奇的是,地址簿会自动将它们链接在一起。

于 2011-01-26T16:46:31.713 回答
1

Xyzzycoder-

如果已经有 localSource,您的解决方案效果很好,但如果没有,则只返回 NULL。

有没有办法,比如说,为 localSource 创建一个 ABRecordRef?我需要能够将我的联系人存储到非同步源。

干杯

于 2011-01-13T14:03:19.290 回答
1

代码有错误,这就是为什么它总是返回两个,因为方法:ABRecordGetRecordType 不是 ABSource 的一部分。它仅包括:

kABPersonType 用于个人记录 kABGroupType 用于组记录。kABSourceType 用于源记录。

要找出正确的类型,您必须使用:ABRecordCopyValue(source, kABSourceTypeProperty) 代替!:) 在有或没有 localSource 的情况下,在我的 iPhone 上都能很好地工作。

祝你好运!

于 2011-02-06T16:47:47.223 回答