Cómo orderar contactos en iOS 7.1

Después de la última actualización de Xcode 5.1, el código de ejemplo de Apple para orderar la libreta de direcciones dejó de funcionar. URL: https://developer.apple.com/library/ios/documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/DirectInteraction.html

Ejemplo de código

ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy( kCFAllocatorDefault, CFArrayGetCount(people), people ); CFArraySortValues( peopleMutable, CFRangeMake(0, CFArrayGetCount(peopleMutable)), (CFComparatorFunction) ABPersonComparePeopleByName, (void*) ABPersonGetSortOrdering() ); CFRelease(addressBook); CFRelease(people); CFRelease(peopleMutable); 

Pero ahora, este código genera una advertencia

Cast to 'void *' from smaller integer type 'ABPersonSortOrdering' (aka 'unsigned int')

En esta linea

 (void*) ABPersonGetSortOrdering()) 

¿Cómo debería haber modificado este código?

De hecho, busqué en los foros de Apple, lo busqué en Google, Stackoverflowed, y no me alegro todavía.

Espero que puedas ayudarme.

ACTUALIZAR

Sus costuras con 64 bits tienen algo que ver con esta advertencia. Coincide con la inclusión de mi nuevo iPhone 5s.

Como dijiste, el problema es con la nueva architecture de 64 bits. (void*) es un puntero de 32 bits para una architecture de 32 bits, pero un puntero de 64 bits para una architecture de 64 bits. La function ABPersonGetSortOrdering() devuelve un valor de tipo ABPersonCompositeNameFormat que se especifica como uint32_t en ABPerson.h. Entonces, la advertencia te avisa que un puntero de 64 bits está apuntando a un número de 32 bits.

La advertencia puede eliminarse tipeando el valor devuelto a un unsigned long . Esto es perfecto porque será de 64 bits en una architecture de 64 bits y 32 bits en una architecture de 32 bits.

 (void *)(unsigned long)ABPersonGetSortOrdering() 

¡Espero que esto ayude!

Sospecho que su problema es hacer con las diferencias entre la architecture de 64 bits y 32 bits, Xcode 5.1 ha habilitado la compatibilidad de 64 bits de forma pnetworkingeterminada. Si los pointers son de 64 bits e ints son de 32 bits, un int es demasiado pequeño para mantener un valor de puntero.

Puede deshabilitar la compilation de 64 bits para su aplicación yendo a su destino> configuration de compilation, pero le recomiendo que no haga eso. Además, el siguiente código funciona para mí, también implementa el nuevo método de creación e implementa correctamente la verificación de autorización (esto asegura que el usuario haya otorgado permiso para que su aplicación acceda a los contactos)

 CFErrorRef * err; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, err); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (!granted) { // No Access to address book, user has denied return; } CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault, CFArrayGetCount(people), people); CFArraySortValues(peopleMutable, CFRangeMake(0, CFArrayGetCount(peopleMutable)), (CFComparatorFunction) ABPersonComparePeopleByName, (void*) ABPersonGetSortOrdering()); CFRelease(addressBook); CFRelease(people); CFRelease(peopleMutable); }); 

Aunque si quisiera ser realmente quisquilloso, diría que probablemente deberías convertir el set de people en un NSArray así:

 NSArray *people = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); 

Luego considere implementar sus methods de sorting utilizando NSSortDescriptors ya que es probable que sean más rápidos, y ciertamente una forma más moderna de hacer las cosas.