Как получить количество людей из источников ExchangeGal, используя ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering () - PullRequest
5 голосов
/ 21 февраля 2011

Я пытаюсь получить людей из трех источников (1 источник MobileMe и 2 * ExchangeGAL источники) из моей адресной книги iOS 4.
Оператор NSLog всегда возвращает 0 человек для ExchangeGAL, но возвращает количество людей для MobileMe.
После получения всех источников из адресной книги iOS с помощью ABAddressBookCopyArrayOfAllSources (addressBook) я пытаюсь перебрать источник по источнику, чтобы получить больше информации для каждого источника.

Правильно ли я использую ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering?
Ожидается подсчет всех людей в разных источниках адресной книги.

-(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];
    }
}

РЕДАКТИРОВАТЬ FEB24: Похоже, код работает, но у меня проблема с подсчетом людей из ExhangeGAL.
Кто-нибудь успешно извлек людей из ExchangeGAL?
Источник MobileMe сообщает количество людей.
Вот журнал из консоли:

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

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Люди, которых вы ожидаете вернуть на самом деле в вашей адресной книге?Вы не должны ожидать, что ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() вернет весь GAL.Это было бы массово.Вы должны только ожидать, что он вернет подмножество ABAddressBookCopyArrayOfAllPeople().

1 голос
/ 02 марта 2011

Попробуйте использовать:

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

Вы можете найти это полезным: abaddressbook-absource-and-absourcetype

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...