Obtaining Specific ABSource from ABAddressBook in iOS 4+

后端 未结 4 599
长情又很酷
长情又很酷 2020-11-28 12:43

Does anyone have an example of how to obtain a specific ABSource from the ABAddressBook in iOS 4+?

4条回答
  •  迷失自我
    2020-11-28 13:05

    iOS 4+ provides new API that allows one to select a specific ABSource from the ABAddressBook. This may be useful as some operations, e.g. creating an ABGroup, are not supported in some sources (i.e. Exchange).

    "Not all source types support groups, more conspicuously, Exchange does not know anything about groups." - http://flavors.me/volonbolon#1a5/tumblr

    Attached are functions that leverage the new API to obtain sources of specific types which may be used in calls to 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);
    }
    

提交回复
热议问题