ABAddressBookCopyArrayOfAllPeople和ABAddressBookGetPersonCount返回不同的大小

由于ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering()与ABAddressBookGetPersonCount()的大小不同,我有一个偶尔崩溃的应用程序。 代码的shell如下所示。 通常nPeople与数组大小相同。 但是,在一个用户的iPhone上(或者至less一个用户所报告的),nPeople几乎是两倍大。 我可以通过使用数组大小​​而不是ABAddressBookGetPersonCount()来停止崩溃。 但是,我不确定这是否意味着我没有访问iPhone中的所有联系人。

  • 有没有人遇到过这个问题?
  • 为什么数字会不一样?

我想知道是否这是联系人被存储在群组(我不知道有团体 – 只是一个想法)。 另外,从用户的电子邮件地址,我怀疑他们使用MobileMe。 我想知道,如果与MobileMe同步将创build具有不同recordId的重复项,但不删除现有的联系人,至less不会达到ABAddressBookGetPersonCount()去。

编辑:我已经看了这一些更多,并有一个相当好的主意,在问题的原因。 正如我想要一个sorting的联系人数组,我使用ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering()。 这需要一个地址簿来源 – 我使用了默认的来源。 我相信可以有各种各样的来源 – 本地来源以及诸如Exchange和MobileMe等其他来源。 因此,我的数组最终将只有本地联系人,而ABAddressBookGetPersonCount()返回的数字将包含所有的来源 – 因此我的崩溃。 因此,我认为最好是在我的应用程序中使用本地数据,并使用由ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering而不是ABAddressBookGetPersonCount返回的数组大小。

CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName); CFIndex nPeople = ABAddressBookGetPersonCount(addressBook); for (int i = 0; i < nPeople; i++) { ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i); } 

ABAddressBookGetPersonCount和ABAddressBookCopyArrayOfAllPeople给出不同的数组。

ABAddressBookGetPersonCount – 返回地址簿中的人员logging数。 ABAddressBookCopyArrayOfAllPeople – 返回地址簿中的所有人员logging。

所以有时候同一个人可能会有额外的logging。 这就是为什么你可能会得到不同的尺寸。

我今天遇到这个问题。 我的应用程序也崩溃在一些特殊的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的人数都less于nPeople

通过Googlesearch,我find了这篇文章 。 我发现也许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个logging。

但在我的通讯录中,我有79个联系人!

然后我犯了一个错误。 我将sources传递给ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering ,就像这样:

  CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, sources, kABPersonSortByLastName); 

allPeople有多less人?

72!

确切地说是不在sources的logging的计数。

我将一个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` } 

现在我可以在通讯录中find所有联系人。

它在我所有的iDevices上都能正常工作!

对于我可怜的英语,我很抱歉

希望这个答案可以帮助你。

注意 :现在我完全不明白AddressBook的source ,有人可以帮我吗?

@Jokinryou Tsui传递源为零是关键,谢谢! 看起来源代码types可能对应于Apple的这个文档: https : //developer.apple.com/library/ios/documentation/AddressBook/Reference/ABSourceRef_iPhoneOS/#//apple_ref/doc/constant_group/Source_Types