clock_get_time / mach_absolute_time deja de actualizarse cuando el dispositivo se apaga en iOS 7

Mi aplicación utiliza mach_absolute_time para calcular las ticks desde el último evento táctil y registra al usuario si supera un límite de time inactivo de 10 minutos.

Todo funciona bien en iOS 6, pero noté que no se comportaba correctamente en iOS 7. Específicamente, cuando el dispositivo iOS 7 está desenchufado (con batería), parece que el dispositivo deja de boost sus ticks una vez que se va a dormir después de esta línea en la console (esto sucede después de unos 5 minutos de inactividad):

powerd [47]: Dormir: usando BATT (Carga: 99%)

Por lo tanto, cuando despierto el dispositivo después de 10 minutos, y calculo las garrapatas usando mach_absolute_time, la diferencia es de solo 5 minutos (cuando en realidad, han pasado 10 minutos).

Curiosamente, todo funciona correctamente y las señales continúan funcionando cuando el dispositivo está conectado a una fuente de alimentación. Nunca muestra que el dispositivo se va a dormir en el logging de la console cuando está conectado (aunque la pantalla se apaga y el comportamiento es el mismo visual que cuando se desenchufa).

He intentado esto usando clock_get_time también, y estoy enfrentando el mismo problema allí.

¿Hay algo que pueda hacer en iOS 7 para mantener el time absoluto de Mach marcando cuando el dispositivo se va a dormir? No quiero usar [[NSDate date] timeIntervalSince1970] ya que los usuarios pueden manipular la hora del sistema y omitir esto.

Gracias por cualquier idea.

Resulta que el comportamiento pnetworkingeterminado de mach_absolute_time () es dejar de marcar una vez que el dispositivo se va a dormir. En iOS 6 pude ampliar el time hasta la suspensión en 10 minutos cuando la aplicación se puso en segundo plano utilizando beginBackgroundTaskWithExpirationHandler . En iOS 7, sin embargo, el time máximo permitido para esto se ha limitado a 3 minutos (se descubrió llamando a backgroundTimeRemaining ). Es por eso que estaba viendo la parada del reloj en iOS 7, pero no en iOS 6.

Tropezamos con esta respuesta hoy, lo que parece prometedor.

 - (time_t)uptime { struct timeval boottime; int mib[2] = {CTL_KERN, KERN_BOOTTIME}; size_t size = sizeof(boottime); time_t now; time_t uptime = -1; (void)time(&now); if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) { uptime = now - boottime.tv_sec; } return uptime; } 

time () continúa incrementándose mientras el dispositivo está dormido, pero, por supuesto, puede ser manipulado por el sistema operativo o por el usuario. Sin embargo, el time de inicio del kernel (una indicación de date y hora cuando el sistema arrancó por última vez) también cambia cuando se cambia el reloj del sistema, por lo tanto, aunque ambos valores no son fijos, el desplazamiento entre ellos es.