Внутренние часы в фоновом режиме iPhone - PullRequest
4 голосов
/ 05 марта 2012

В моем приложении я хочу запустить внутренние часы в фоновом режиме [пока приложение не работает на переднем плане].

Вся функциональность будет такой:

Цель состоит в том, чтобы получить время сервера для использования в приложении, поскольку использование времени устройства может иногда вызывать проблемы. Проблемы могут быть в ситуациях, когда кто-то изменил время пользователя iPhone и т. Д. Поэтому я следую приведенному ниже методу.

- Запуск внутренних часов в фоне моего приложения, даже если приложение не запущено. -Связаться с сервером каждые 15 минут, чтобы получить в режиме реального времени и запустить таймер. -Если сеть между ними отключена, таймер продолжит работу и займет время таймера.

Мое заявление сильно зависит от этого временного фактора, так как это система бронирования билетов. Пожалуйста, помогите мне реализовать это или, пожалуйста, подтвердите, возможно ли это или нет?

Я занимаюсь разработкой приложения для iPhone, в котором используется система бронирования билетов. Я зарегистрировал свое приложение как основанное на определении местоположения, поскольку оно использует местоположение пользователя в заданном фоновом режиме.

Моя проблема в том, что мне нужно запустить внутренние часы в моем приложении в фоновом режиме. Мне нужно написать коды для внутренних часов в основных методах делегирования местоположения, чтобы внутренние часы также работали вместе с сервисами, определяемыми местоположением. Будет ли мое приложение отклонено? Что-то не так в этом деле?

Мне нужно указать правильное время для использования в моем приложении, чтобы я запускал эти внутренние часы. Я могу использовать NSDate, но это вернет время устройства. Любой может изменить время устройства. Так что, как только кто-то насторожился, неправильное время повлияет на нормальное функционирование приложения. Будь добр, некий орган посоветует получить правильное время без внутренних часов?

Ответы [ 5 ]

14 голосов
/ 17 марта 2012

Обновление: Извините, что мой первоначальный ответ неверен.Когда устройство переходит в спящий режим (это может произойти через некоторое время после блокировки), внутренние часы процессора перестают тикать, и 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-уведомления, чтобы предупредить пользователя о приближении целевой даты,даже если приложение не запущено.

2 голосов
/ 14 марта 2012

Я думаю, что вы можете только обнаружить, что дата устройства iOs была изменена (используя NSSystemClockDidChangeNotification). Я предполагаю, что вы используете это уведомление и принудительно перезагрузите реальную дату вашего приложения с вашего сервера (с помощью WebService).

РЕДАКТИРОВАТЬ: Вы можете использовать systemUptime в NSProcessInfo:

 NSLog(@"ProcessInfo System uptime: %f",[NSProcessInfo processInfo].systemUptime);

, но это не решит вашу проблему, если устройство будет перезапущено.

2 голосов
/ 05 марта 2012

яблоко - это поддержка небольшой задачи для фонового режима, которая будет работать только в течение примерно 10 секунд.

так что вы можете сделать одну вещь, когда приложение активно, затем получить сервер формы времени и обновить свое местное время в соответствии с этим.

1 голос
/ 21 марта 2012
  1. настройки часового пояса не должны влиять на время, как в UTC
  2. ваше приложение не может работать в фоновом режиме.Злоупотребление требованием местоположения для этого приведет к отклонению вашего приложения Apple

, поэтому мое предложение: сделайте на стороне логического сервера push-уведомление

1 голос
/ 17 марта 2012

Я думаю, что есть 2 способа решить вашу проблему.

  1. Никогда не используйте системное время. Другими словами, никогда не вызывайте [NSDate date] в вашем коде. Когда вам нужно текущее время, позвоните на NTP-сервер. Это, конечно, приведет к задержке в вашем приложении, но гарантирует точность.

  2. Когда приложение запускается или выходит на передний план, убедитесь, что системное время достаточно точно относительно NTP-сервера. Если системное время отключено более чем на допустимый уровень, не позволяйте им продолжать запускать приложение, пока они не обратятся к нему. Если с системным временем все в порядке, запустите мониторинг, чтобы убедиться, что они не изменяют системное время при запуске приложения (NSSystemClockDidChangeNotification). Если они проходят начальную проверку, но перемещают часы вперед, вы можете поймать это и отключить приложение, пока они не изменят его на точность.

Вот реализация NTP для iOS, которая может быть полезна при реализации любого из указанных выше решений. http://code.google.com/p/ios-ntp/

РЕДАКТИРОВАТЬ: приложение Ticketmaster использует технику № 2, так что это кажется разумным решением для приложения, где требуется правильное системное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...