从iOS 4+中的ABAddressBook获取特定的ABSource

xyz*_*der 3 iphone abaddressbook ios4

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

xyz*_*der 9

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

"并非所有的源类型都支持组,更引人注目的是,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);
}
Run Code Online (Sandbox Code Playgroud)

  • 读者请注意,并非所有设备都有本地源(请参阅下面的注释),因此您需要能够处理所请求源不存在的情况.似乎也无法以编程方式创建本地源. (4认同)