Моя команда и я столкнулись с ошибкой, которая, вероятно, вызвана тем, что системное время iOS не увеличивается монотонно, а прыгает назад. Измеренная разница во времени составила около -50 миллисекунд. (Очевидно, что это не вопрос дополнительной секунды или часового пояса.)
Мы понимаем, что устройства iOS синхронизируют свое время с NTP-серверами, находясь в сети. Но отрицательная разница во времени наблюдалась при полном отсутствии подключения к сети.
Есть ли какие-либо причины, по которым iOS будет обновлять системное время в автономном режиме?
Соответствующие сообщения:
Нам, безусловно, нужно следовать этому подходу для измерения прошедшего времени. Но тем не менее, хотелось бы понять, что послужило причиной скачка.
В этом ответе упоминаются причины таких скачков времени, но ни одна из них, похоже, не применима в моем случае.
В этом ответе упоминаются значительные временные изменения . Но что такое незначительные изменения?
Обновление: после 2 часов в режиме полета мы наблюдали скачок времени на 637 мс в прошлое на System.DateTime.Now
iPad Mini 2, при этом CACurrentMediaTime
продолжая монотонно увеличиваться. До сих пор неясно, почему iOS должна делать такой значительный скачок после такого длительного времени без обновлений NTP.
Часы RTC периодически «подстраиваются» для корректировки времени (например, для учета дрейфа часов) — это происходит независимо от того, находитесь ли вы в сети или в автономном режиме. Это стандартно для современных операционных систем, а не только для iOS.
Ошибка не в вашей операционной системе, а в вашем приложении. Если вам нужны монотонно увеличивающиеся часы, вам не следует использовать System.DateTime.Now.
Чтобы выбрать правильную функцию таймера/часов для вашего приложения, вам нужно определить, для чего вы хотите использовать время, а затем выбрать соответствующий вариант. Т.е. потребность в отображении текущего времени для пользователя в «приложении часов» сильно отличается от необходимости времени для запуска таймера, который периодически срабатывает каждые 50 мс в игре.
bmike