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