La aplicación se bloqueó en iOS 6 cuando el usuario cambia los permisos de acceso a Contactos

Tengo una aplicación que usa la libreta de direcciones. Cuando se ejecuta en iOS 6 ejecuta este código cuando el usuario hace algo que requiere acceso a la libreta de direcciones.

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { if (granted) { showContactChooser(); } }); CFRelease(addressBookRef); } else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { showContactChooser(); } else { showAccessDeniedAlert(); } 

Esto funciona perfectamente: puedo leer la información de los contactos y cuando el usuario denegó el acceso, la aplicación reactjs en consecuencia.

Sin embargo, si el usuario:

  1. Permite el acceso de Contactos en la aplicación,
  2. Sale de la aplicación,
  3. Accede a Configuración-> Privacidad-> Contactos y deshabilita el acceso a Contactos para la aplicación,
  4. Ejecuta la aplicación,
  5. Mientras la aplicación se ejecuta en segundo plano, va a la configuración y habilita el acceso de contacto para la aplicación,

la aplicación se bloquea inmediatamente dentro de main() sin información de excepción o un seguimiento de stack significativo. Traté de activar el punto de interrupción “todas las excepciones” y [NSException raise] , pero eso no me dio más información.

El locking puede reproducirse incluso si la aplicación no ejecuta el código anterior durante el lanzamiento.

¿Que esta pasando aqui? ¿Hay una callback a la que me debería suscribir?

Lo he visto en mi propia aplicación. Y he visto a otros informar esto también. Estoy bastante seguro de que esto es un comportamiento deliberado. El sistema operativo mata todas las aplicaciones en segundo plano que reactjsn a los cambios en los permisos de privacidad. Apple parece haber tomado un enfoque mazo a esto. No es un locking (aunque puede aparecer así cuando se ejecuta en el depurador). Las aplicaciones se terminan por varias otras razones. Agregue esto a la lista de razones. Esto nos da más razones para hacer un buen trabajo al restaurar el estado de la aplicación tras un reinicio completo de nuestras aplicaciones.

Tenga en cuenta que este comportamiento se aplica a todas las diversas configuraciones de privacidad, como contactos, fotos, micrófono, calendario y cámara.

Usualmente, cuando una aplicación regresa de ser suspendida, debe llamar a la aplicación: didEnterForeground desde su AppDelegate. En mi opinión, ese sería un buen lugar para reajustar los permisos de su libreta de direcciones.

    Intereting Posts