ABAddressBookCopyArrayOfAllPeople y ABAddressBookGetPersonCount devuelven diferentes tamaños

Tengo una aplicación que se cuelga de vez en cuando debido a la matriz devuelta por ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering () que tiene un tamaño diferente a ABAddressBookGetPersonCount (). El shell del código se muestra a continuación. Por lo general, nPeople tiene el mismo tamaño que la matriz. Sin embargo, en el iPhone de un usuario (o al less, según lo informado por un usuario), nPersonas es casi dos veces más grande. Puedo detener el locking utilizando el tamaño de matriz, en lugar de ABAddressBookGetPersonCount (). Sin embargo, no estoy seguro si esto significa que no estoy accediendo a todos los contactos en el iPhone.

  • ¿Alguien ha encontrado este problema antes?
  • ¿Por qué los numbers serían diferentes?

Me pregunté si era algo que ver con los contactos almacenados en Grupos (no sé si hay grupos, solo una idea). Además, de la dirección de correo electrónico del usuario, sospecho que usan MobileMe. Me preguntaba si la synchronization con MobileMe crearía duplicates con un ID de logging diferente, pero no eliminaría el contacto existente, al less no tan lejos como ABAddressBookGetPersonCount ().

EDIT: He examinado esto un poco más y tengo una buena idea de la causa del problema. Como quería una matriz orderada de contactos, utilicé ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering (). Esto requiere una fuente de la libreta de direcciones: utilicé la fuente pnetworkingeterminada. Creo que puede haber varias fonts: la fuente local y otras como Exchange y MobileMe. Por lo tanto, mi matriz terminará solo con los contactos locales, mientras que el número devuelto por ABAddressBookGetPersonCount () includeá todas las fonts, de ahí mi locking. Por lo tanto, creo que sería mejor trabajar con los datos locales en mi aplicación y utilizar el tamaño de matriz devuelto por ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering en lugar de ABAddressBookGetPersonCount.

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

ABAddressBookGetPersonCount y ABAddressBookCopyArrayOfAllPeople proporciona diferentes matrices.

ABAddressBookGetPersonCount – Devuelve el número de loggings de personas en una libreta de direcciones. ABAddressBookCopyArrayOfAllPeople: devuelve todos los loggings de la persona en una libreta de direcciones.

Entonces, algunas veces la misma persona puede tener loggings adicionales. Es por eso que puede get diferentes tamaños.

Hoy encuentro este problema. Mi aplicación también falla en algunos iDevices especiales.

código:

  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` } 

Pero se bloqueará a veces. Al agregar algunos puntos de corte encontré que el conteo de todos es menor que nPeople .

Por google, encontré este artículo . Descubrí que tal vez hay algo mal con ABAddressBookCopyDefaultSource . Aquí tengo la fuente pnetworkingeterminada , tengo que tener todas las fonts en su lugar.

código:

 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)); } 

Entonces tengo

  kABSourceTypeCardDAV Count of allPeopleInSource: 7 

lo que significa que solo hay una fuente y solo 7 loggings en esa fuente.

¡Pero en mi libreta de direcciones, tengo 79 contactos!

Entonces cometí un error. Pasé las sources a ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering , al igual que esto:

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

¿Cuántos miembros en allPeople ?

72 !!!

Exactamente el recuento de los loggings que no están en las sources .

Pasé un CFArrayRef a ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering como el segundo parámetro, que espera un ABRecordRef. ¿Qué pasa si paso nil ?

Finalmente, obtuve los códigos:

  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` } 

Ahora puedo get todos los contactos en mi libreta de direcciones.

¡Funciona bien en todos mis iDevices!

Lamento mucho mi pobre inglés …

Con suerte, esta respuesta puede ayudarte.

Nota : Ahora no entiendo exactamente qué es exactamente la source en la libreta de direcciones. ¿Alguien puede ayudarme?

@Jokinryou Tsui Pasar fuente como cero fue la key, gracias! Parece que los types de origen pueden corresponder a esta documentation de Apple: https://developer.apple.com/library/ios/documentation/AddressBook/Reference/ABSourceRef_iPhoneOS/#//apple_ref/doc/constant_group/Source_Types