¡Ese fue el truco perfecto para mí!
En iOS6, Apple introduce un nuevo control de privacidad, el usuario puede controlar el acceso al contacto y al calendario de cada aplicación. Entonces, en el lado del código, debe agregar alguna forma de solicitar el permiso. En iOS5 o antes, siempre podemos llamar
ABAddressBookRef addressBook = ABAddressBookCreate();
para obtener la libreta de direcciones sin ningún problema, pero en iOS6, si no tiene permiso, esta llamada solo devolverá un puntero vacío. Es por eso que necesitamos cambiar el método para obtener ABAddressBookRef.
__block BOOL accessGranted = NO;
if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
accessGranted = granted;
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);
}
else { // we're on iOS 5 or older
accessGranted = YES;
}
if (accessGranted) {
// Do whatever you want here.
}
En el código, el semáforo se usa para bloquear hasta la respuesta, mientras que ABAddressBookRequestAccessWithCompletion solicitará permiso si la aplicación no lo solicitó antes. De lo contrario, solo seguirá la configuración en Configuración-Privacidad-Contacto.
FUENTE: http://programmerjoe.blogspot.com/2012/10/ios6-permissions-contacts.html