Я встречаюсь с этой проблемой сегодня. Мое приложение также зависает в некоторых специальных устройствах.
код:
ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < nPeople; i++) {
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
// more thing with `person`
}
Но иногда он падает. Добавляя некоторые точки останова, я обнаружил, что число allPeople
меньше nPeople
.
По поиску, я нашел эту статью . Я обнаружил, что, возможно, что-то не так с ABAddressBookCopyDefaultSource
. Здесь у меня есть источник по умолчанию , вместо этого я должен получить все источники .
код:
CFArrayRef sources = ABAddressBookCopyArrayOfAllSources(addressBook);
CFIndex sourceCount = CFArrayGetCount(sources);
for (CFIndex i = 0; i < sourceCount; i++) {
ABRecordRef currentSource = CFArrayGetValueAtIndex(source, i);
int sourceType = [(__bridge NSNumber *)ABRecordCopyValue(currentSource, kABSourceTypeProperty) intValue];
switch (sourceType) {
case kABSourceTypeCardDAV:
NSLog(@"kABSourceTypeCardDAV");
break;
case kABSourceTypeCardDAVSearch:
NSLog(@"kABSourceTypeCardDAVSearch");
break;
case kABSourceTypeExchange:
NSLog(@"kABSourceTypeExchange");
break;
case kABSourceTypeExchangeGAL:
NSLog(@"kABSourceTypeExchangeGAL");
break;
case kABSourceTypeLDAP:
NSLog(@"kABSourceTypeLDAP");
break;
case kABSourceTypeLocal:
NSLog(@"kABSourceTypeLocal");
break;
case kABSourceTypeMobileMe:
NSLog(@"kABSourceTypeMobileMe");
break;
default:
break;
}
CFArrayRef allPeopleInSource = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, currentSource, kABPersonSortByLastName);
NSLog(@"Count of allPeopleInSource: %i", CFArrayGetCount(allPeopleInSource));
}
Тогда я получил
kABSourceTypeCardDAV
Count of allPeopleInSource: 7
, что означает, что есть только один источник и только 7 записей в этом источнике.
Но в моей адресной книге у меня 79 контактов!
Тогда я допустил ошибку. Я передал sources
на ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
, вот так:
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, sources, kABPersonSortByLastName);
Сколько членов в allPeople
?
72 !!!
Точное количество записей, которых нет в sources
.
Я передал CFArrayRef в ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
в качестве второго параметра, который ожидает ABRecordRef. Что если я пройду nil
?
Наконец я получил коды:
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, nil, kABPersonSortByLastName);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < nPeople; i++) {
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
// more thing with `person`
}
Теперь я могу получить все контакты в моей адресной книге.
Отлично работает на всех моих iDevices!
Я очень сожалею о своем плохом английском ...
Надеюсь, этот ответ поможет вам.
Примечание : Теперь я не понимаю, что такое source
в AddressBook, кто-нибудь может мне помочь?