Обновление: Извините, что мой первоначальный ответ неверен.Когда устройство переходит в спящий режим (это может произойти через некоторое время после блокировки), внутренние часы процессора перестают тикать, и mach_absolute_time
также не обновляется.Теоретически он вернет точно такое же значение, если вы вызовете его прямо перед тем, как устройство перейдет в спящий режим, и после того, как оно проснется.
Лучший из известных мне способов проверки изменений даты - это kern.boottime
, он содержитвремя загрузки и изменяется всякий раз, когда изменяется системное время.Помимо прочего, kern.boottime будет обновляться, если пользователь изменяет время, или если ОС изменяет само время в соответствии с информацией из вышек сотовой связи.
Таким образом, в вашем случае вы можете взять исходное время, которое вы рассчитали, и изменить его в соответствии с изменениями в kern.boottime.Если вы видите, что kern.boottime значительно изменился, это может означать, что устройство было выключено, и в этом случае вам нужно будет связаться с сервером, чтобы узнать время до вылета.
Соответствующий код:
time_t getBootTimeSecs(void)
{
struct timeval boottime;
size_t size = sizeof(boottime);
int ret = sysctlbyname("kern.boottime", &boottime, &size, NULL, 0);
assert(ret == 0);
return boottime.tv_sec;
}
Оригинальный (неправильный) ответ: Вы можете использовать mach_absolute_time
, на который не влияют изменения даты, сделанные пользователем.
Когда вы бронируете билет, получите правильную дату с сервера и запишите mach_absolute_time
.Теперь вы всегда сможете звонить mach_absolute_time
, когда захотите, рассчитать разницу с той, которую вы записали изначально, и отобразить правильную дату.
Это будет работать только до тех пор, пока устройство не будет отключено.вниз, в этом случае имеет смысл повторно подключить приложение к серверу, чтобы получить правильную дату.
Вы также можете использовать локальные или Push-уведомления, чтобы предупредить пользователя о приближении целевой даты,даже если приложение не запущено.