Como faço para contar pessoas de fontes ExchangeGal usando ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering()

StackOverflow https://stackoverflow.com/questions/5062968

Pergunta

Estou tentando obter pessoas em três fontes (1 fonte MobileMe e 2 * fontes ExchangeGAL) do meu catálogo de endereços do iOS 4.
A instrução NSLog sempre retorna 0 pessoas para ExchangeGAL, mas retorna uma contagem de pessoas para MobileMe.
Depois de obter todas as fontes do catálogo de endereços do iOS usando ABAddressBookCopyArrayOfAllSources(addressBook), estou tentando iterar fonte por fonte para obter mais informações para cada fonte.

Estou usando ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering corretamente?
Seria de esperar uma contagem de todas as pessoas nas diferentes fontes do catálogo de endereços.

-(void)countPeopleInSources
{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef allSources = ABAddressBookCopyArrayOfAllSources(addressBook);
    for (CFIndex i = 0; i < CFArrayGetCount(allSources); i++) 
    {
        ABRecordRef source = (ABRecordRef)CFArrayGetValueAtIndex(allSources, i);
        NSNumber *sourceTypeRef = (NSNumber *)((CFNumberRef)ABRecordCopyValue(source, kABSourceTypeProperty));
        ABPersonSortOrdering sortOrdering = ABPersonGetSortOrdering();
        int sourceType = [sourceTypeRef intValue];
        switch (sourceType) {
        case kABSourceTypeCardDAV:
            NSLog(@"SourceTypeCardDAV");
            break;
        case kABSourceTypeCardDAVSearch:
            NSLog(@"SourceTypeCardDAVSearch");
            break;
        case kABSourceTypeExchange:
            NSLog(@"SourceTypeExchange");
            break;
        case kABSourceTypeExchangeGAL:
            NSLog(@"SourceTypeExchangeGAL");
            break;
        case kABSourceTypeLDAP:
            NSLog(@"SourceTypeLDAP");
            break;
        case kABSourceTypeLocal:
            NSLog(@"SourceTypeLocal");
            break;
        case kABSourceTypeMobileMe:
            NSLog(@"SourceTypeMobileMe"); 
            break;
        default:
            break;
    }
        CFArrayRef allPeopleInSource = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, sortOrdering );
        NSLog(@"Count allPeopleInSource: %i", CFArrayGetCount(allPeopleInSource));

        [sourceTypeRef release];
    }
}

EDITAR 24 DE FEVEREIRO:Parece que o código funciona, mas tenho problemas para obter a contagem de pessoas no ExhangeGALs.
Alguém recuperou com sucesso pessoas do ExchangeGAL?
A fonte do MobileMe relata uma contagem de pessoas.
Aqui está o log do Console:

2011-02-24 07:04:32.578 Contacts[10099:307] SourceTypeExchangeGAL
2011-02-24 07:04:32.593 Contacts[10099:307] Count allPeopleInSource: 0
2011-02-24 07:04:32.597 Contacts[10099:307] SourceTypeMobileMe
2011-02-24 07:04:32.641 Contacts[10099:307] Count allPeopleInSource: 151
2011-02-24 07:04:32.646 Contacts[10099:307] SourceTypeExchangeGAL
2011-02-24 07:04:32.652 Contacts[10099:307] Count allPeopleInSource: 0
Foi útil?

Solução

Tente usar:

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);
    ABSourceType sourceType = [(NSNumber *)ABRecordCopyValue(currentSource, kABSourceTypeProperty) intValue];
    if (mySourceType == sourceType) {
        resultSource = currentSource;
        break;
    }
}

return resultSource;
}

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

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

ABRecordRef mobileMeSource()
{
     return sourceWithType(kABSourceTypeMobileMe);
}

Você pode achar isso útil:abaddressbook-absource-and-absourcetype

Outras dicas

As pessoas que você espera retornar estão realmente na sua agenda?Você não deveria esperar ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() para retornar a GAL inteira.Isso seria enorme.Você só deve esperar que ele retorne um subconjunto de ABAddressBookCopyArrayOfAllPeople().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top