Today I meet this problem. My app also crashes in some special iDevices.
the code:
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);
But he will sometimes fall. By adding some breakpoints, I found that allPeople
count is less than nPeople
.
By googling I found this article . I found that there might be something wrong with ABAddressBookCopyDefaultSource
. Here I got the default source , I have to get all the sources .
the code:
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)); }
Then i got
kABSourceTypeCardDAV Count of allPeopleInSource: 7
which means that in this source there is only one source and only 7 records.
But in my address book I have 79 contacts!
Then I made a mistake. I passed sources
to ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
, like this:
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, sources, kABPersonSortByLastName);
How many members are allPeople
?
72 !!!
It is the number of records that are not in sources
.
I passed CFArrayRef to ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
as the second parameter that ABRecordRef expects. What if i pass nil
?
Finally, I got the codes:
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, nil, kABPersonSortByLastName); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); for (int i = 0; i < nPeople; i++) { ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
Now I can get all the contacts in my address book.
It works great on all my iDevices!
I'm sorry my bad english ...
Hope this answer helps you.
Note : now I do not understand what source
in the address book, can someone help me?