Razones por las que el tiempo del sistema iOS salta hacia atrás en un iPad mientras está desconectado

Mi equipo y yo nos encontramos con un error, que probablemente se deba a que el tiempo del sistema iOS no se incrementa de manera monótona, sino que salta hacia atrás. La diferencia de tiempo medida fue de aproximadamente -50 milisegundos. (Eso obviamente no es un problema de segundo bisiesto o zona horaria).

Entendemos que los dispositivos iOS sincronizan su hora con los servidores NTP mientras están en línea. Pero la diferencia horaria negativa se observó sin tener ninguna conexión de red.

¿Hay alguna razón por la que iOS actualice la hora del sistema mientras está fuera de línea?

Publicaciones relevantes:

  • Ciertamente necesitaremos seguir este enfoque para medir los tiempos transcurridos. Sin embargo, nos gustaría entender qué estaba causando el salto.

  • Esta respuesta menciona las razones de tales saltos de tiempo, pero ninguno de ellos parece aplicarse en mi caso.

  • Esta respuesta menciona cambios de tiempo significativos . Pero, ¿qué son los cambios insignificantes?

Actualización: después de 2 horas en modo avión, observamos un salto de tiempo de 637 ms hacia el pasado en System.DateTime.Nowun iPad Mini 2, mientras CACurrentMediaTimeseguía aumentando monótonamente. Todavía no está claro por qué iOS debería dar un salto tan significativo después de tanto tiempo sin actualizaciones de NTP.

¿Quieres decir que se detiene y tartamudea, por lo que termina atrasado o crees que lo estás midiendo registrando dos veces los mismos momentos?

Respuestas (1)

El reloj RTC se "ajusta" periódicamente para corregir su hora (por ejemplo, para tener en cuenta la desviación del reloj); esto sucede sin importar si está en línea o fuera de línea. Esto es estándar en los sistemas operativos modernos, no solo en iOS.

El error no está en su sistema operativo, sino en su aplicación. Si desea un reloj que aumente monótonamente, no debe usar System.DateTime.Now.

Para seleccionar la función de temporizador/reloj correcta para su aplicación, debe determinar para qué desea usar el tiempo y luego seleccionar en consecuencia. Es decir, es una necesidad muy diferente querer que la hora actual se muestre al usuario en una "aplicación de reloj" en comparación con necesitar tiempo para ejecutar un temporizador que se disparará cada 50 ms periódicamente en un juego.