我今天遇到这个问题。我的应用程序也在一些特殊的iDevices中崩溃。
代码:
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
。我发现this article。我发现可能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
在通讯录准确地说,任何人可以帮助我吗?
这意味着ABAddressBookGetPersonCount应该始终小于ABAddressBookCopyArrayOfAllPeople? –
这取决于。如果同一个人可能有额外的记录,这将是不同的。如果每个人都有一个联系号码。那么两者将是相同的。 :) @NikitaP –