Причины, по которым системное время iOS откатывается назад на iPad в автономном режиме

Моя команда и я столкнулись с ошибкой, которая, вероятно, вызвана тем, что системное время iOS не увеличивается монотонно, а прыгает назад. Измеренная разница во времени составила около -50 миллисекунд. (Очевидно, что это не вопрос дополнительной секунды или часового пояса.)

Мы понимаем, что устройства iOS синхронизируют свое время с NTP-серверами, находясь в сети. Но отрицательная разница во времени наблюдалась при полном отсутствии подключения к сети.

Есть ли какие-либо причины, по которым iOS будет обновлять системное время в автономном режиме?

Соответствующие сообщения:

  • Нам, безусловно, нужно следовать этому подходу для измерения прошедшего времени. Но тем не менее, хотелось бы понять, что послужило причиной скачка.

  • В этом ответе упоминаются причины таких скачков времени, но ни одна из них, похоже, не применима в моем случае.

  • В этом ответе упоминаются значительные временные изменения . Но что такое незначительные изменения?

Обновление: после 2 часов в режиме полета мы наблюдали скачок времени на 637 мс в прошлое на System.DateTime.NowiPad Mini 2, при этом CACurrentMediaTimeпродолжая монотонно увеличиваться. До сих пор неясно, почему iOS должна делать такой значительный скачок после такого длительного времени без обновлений NTP.

Вы имеете в виду, что он делает паузу и заикается, поэтому он оказывается позади, или вы думаете, что измеряете его дважды в одни и те же моменты?

Ответы (1)

Часы RTC периодически «подстраиваются» для корректировки времени (например, для учета дрейфа часов) — это происходит независимо от того, находитесь ли вы в сети или в автономном режиме. Это стандартно для современных операционных систем, а не только для iOS.

Ошибка не в вашей операционной системе, а в вашем приложении. Если вам нужны монотонно увеличивающиеся часы, вам не следует использовать System.DateTime.Now.

Чтобы выбрать правильную функцию таймера/часов для вашего приложения, вам нужно определить, для чего вы хотите использовать время, а затем выбрать соответствующий вариант. Т.е. потребность в отображении текущего времени для пользователя в «приложении часов» сильно отличается от необходимости времени для запуска таймера, который периодически срабатывает каждые 50 мс в игре.