Как я могу получить реальное время в iPhone, а не время, установленное пользователем в настройках? - PullRequest
6 голосов
/ 18 сентября 2009

Мне нужно убедиться, что мое приложение получает правильное время, а не время, установленное пользователем в настройках.

Так, например, как только пользователь запустит приложение, я бы хотел получить метку времени. Пользователь будет видеть истекшее время на экране таймера, обновляемого каждую секунду. Когда пользователь выходит из приложения и через некоторое время перезапускает приложение, таймер просто получает текущее время и сравнивает его с исходной временной меткой, которую он сохранил. Так что в основном, как секундомер в Clock.App на iPhone.

Теперь проблема с clock.app заключается в том, что если пользователь уходит и увеличивает время в настройках на один час, это повлияет на таймер. Очевидно, я не хочу этого, потому что в моем приложении это было бы обманом.

Мне нужно найти более надежный источник времени для сравнения.

Я мог бы получить время из интернета. Но проблема в том, что мне нужно подключение к Интернету, поэтому работает только при наличии подключения к Интернету. Мое приложение должно работать в автономном режиме, желательно.

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

Есть ли способ проверить, изменил ли пользователь время в настройках?

Есть еще идеи?

Спасибо

Ответы [ 4 ]

1 голос
/ 20 сентября 2009

Лучшее решение, которое я придумал, - это использование таймера мах, который отсчитывает единицы времени с момента последней загрузки iphone.

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

Я обнаруживаю перезагрузку, сначала сохраняя временную метку iphone, связанную с таймером маха, а затем проверяю каждый раз при запуске приложения, чтобы она не менялась. Это имеет побочный эффект: если пользователь меняет iPhone DateTime во время его работы, это также приведет к аннулированию счета, но это нормально.

Как определить, перезагрузился ли iphone с момента последнего запуска приложения

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

1 голос
/ 18 сентября 2009

Получить время из NIST с дневным протоколом:

Дневное обслуживание на основе UDP Сервер прослушивает дейтаграммы UDP через порт UDP 13. При получении дейтаграммы отправляется датаграмма-ответ, содержащая текущую дату и время в виде строки символов ASCII (данные в полученной дейтаграмме игнорируются).

NIST Формат ответа: JJJJJ YR-MO-DA ЧЧ: ММ: СС TT L H MSADV UTC (NIST) OTM

http://tf.nist.gov/service/its.htm

http://tf.nist.gov/tf-cgi/servers.cgi

0 голосов
/ 07 января 2014

Этот метод находит текущее время, найденное в заголовке ответа google.com:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                initWithURL:[NSURL URLWithString:@"http://google.com"]];

[request setHTTPMethod:@"GET"];

NSHTTPURLResponse *httpResponse = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&httpResponse error:nil];
NSString *dateString = [[httpResponse allHeaderFields] objectForKey:@"Date"];
NSDate *currentDate = [NSDate dateWithNaturalLanguageString:dateString locale:NSLocale.currentLocale];
0 голосов
/ 02 июля 2013

Я только что опубликовал следующее здесь :

Это работает, чтобы получить время GPS:

#import <CoreLocation/CoreLocation.h>

CLLocation* gps = [[CLLocation alloc]
                       initWithLatitude:(CLLocationDegrees) 0.0
                       longitude:(CLLocationDegrees) 0.0];
NSDate* now = gps.timestamp;

Это не похоже на защиту от взлома.

Я пробовал этот код на iPhone 4 в режиме полета (iOS 6.1), и даже тогда он дает время, все в порядке. Но, к сожалению, это время, похоже, меняется с системными часами. Тьфу.

Забавно, что я обнаружил (все еще в режиме полета), что если вы вмешиваетесь в системные часы (после включения off Время и дата Set Automatically), а затем поворачиваете Set Automatically обратно на on, Машина восстанавливает реальное (оригинальное) время без заминки. это работает даже после включения питания телефона. Таким образом, кажется, что - это что-то вроде времени защиты от несанкционированного доступа, которое устройство поддерживает внутренне. Но как получить к этому доступ?

...