iOS: idleTimerDisabled = YES funciona solo hasta que se utilizó ImagePicker

Tengo una herramienta de encuesta de iPad como una aplicación empresarial interna. [[UIApplication shanetworkingApplication] setIdleTimerDisabled: YES]; locking de pantalla con la configuration [[UIApplication shanetworkingApplication] setIdleTimerDisabled: YES]; en didFinishLaunchingWithOptions del delegado de la aplicación.

Eso funciona bien hasta que uso imagePicker para tomar una image. Después de eso, el idleTimer se vuelve a activar. Intenté deshabilitarlo después de que se tomó la image, pero eso no funciona.

Aquí encontré la sugerencia de que configurar las capacidades de dispositivo requeridas en info.plist podría ayudar. Pero hasta ahora no fue así. Acabo de agregar todas las banderas específicas de la camera.

¿Algunas ideas?

¡Muchas gracias!

Marcus

Pude restablecer la UIApplication idleTimerDisabled así:

 - (void)resetIdleTimerDisabled { [[UIApplication shanetworkingApplication] setIdleTimerDisabled:YES]; } #pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [self dismissViewControllerAnimated:YES completion:^{ [self performSelector:@selector(resetIdleTimerDisabled) withObject:nil afterDelay:1.0]; }]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [self dismissViewControllerAnimated:YES completion:^{ [self performSelector:@selector(resetIdleTimerDisabled) withObject:nil afterDelay:1.0]; }]; } 

Lo que sospecho que está sucediendo es que internamente UIImagePickerController establece UIApplication.idleTimerDisabled en YES para evitar que la camera duerma. Cuando finaliza (después de que se invocan los methods de delegado y aparentemente incluso después de que se ejecuta el bloque de finalización de la animation), UIImagePickerController establece UIApplication.idleTimerDisabled nuevo en NO . En cambio, solo debería hacerlo si el valor era anteriormente NO .

Presenté un informe de errores con Apple. Consulte el proyecto de ejemplo UIImageViewControllerBug .

¡La solución de Jamie se ve bien! Simplemente no soy un gran fan de afterDelay: methods 🙂

El problema está en el marco de PhotoLibrary: deshabilita el idleTimer antes de iniciar la transmisión de vista previa desde la camera y lo activa de nuevo cuando se descomprime independientemente del valor anterior.

Si sientes más aventuras y quieres una solución que funcione en toda la aplicación, aquí hay una que incluye swizzling: https://gist.github.com/zats/1a4aece697075478b44a

Probado para ambos casos cuando idleTimer deshabilitado o habilitado antes de mostrar el selector de image. Mi solución no observa idleTimerDisabled mientras se presenta el selector de image.

PD, el mismo problema ocurre cuando se usa la function de dictado (error en UIDictationController ) (@ jamie-mcdaniel si sería tan amable de actualizar su informe de errores)