Можно ли получить временную метку атомных часов от iphone GPS? - PullRequest
8 голосов
/ 18 сентября 2009

Я ищу надежный способ получить время. Он не может быть подделан и должен работать в автономном режиме. Таким образом, нет времени в Интернете, нет пользовательских настроек времени и нет времени работы BSD с момента последней перезагрузки. Мне было интересно, так как GPS работает с использованием атомных часов, могу ли я получить доступ к этой информации.

Спасибо

Ответы [ 5 ]

7 голосов
/ 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 Машина восстанавливает реальное (оригинальное) время без заминки. это работает даже после включения питания телефона. Таким образом, кажется, что - это что-то вроде времени защиты от несанкционированного доступа, которое устройство поддерживает внутренне. Но как получить к этому доступ?

P.S. Обсуждение этого с 2010 года. Автор предпоследнего комментария попытался сделать это в убежище от радиоактивных осадков: поэтому ясно, что телефон не получает первозданного времени из какого-либо внешнего источника.

Приложение, июль 2013 г.

Нашел еще несколько постов ( здесь , здесь и здесь ) о другом виде измерения времени: времени загрузки ядра системы. Доступ к нему осуществляется через вызов примерно так: sysctlbyname("kern.boottime", &boottime, &size, NULL, 0);. К сожалению, оно также меняется с учетом пользовательских данных и времени, даже без перезагрузки. Другая функция gettimeofday() аналогичным образом зависит от определенного пользователем времени.

4 голосов
/ 21 января 2011

NSDate и его CF-аналог основаны на времени, контролируемом пользователем, и, следовательно, не защищают от подделки.

Насколько я знаю, нет открытого API ни для времени GPS, ни для времени доставки напрямую. Тем не менее, вы можете проверить mach_absolute_time, чтобы получить время без изменений с момента последней загрузки, и, возможно, использовать его, чтобы, по крайней мере, знать, сколько времени прошло с момента пробуждения приложения (не имея возможности подделать время приложение работает).

mach_absolute_time зависит от процессора устройства. Он возвращает тики с момента последней перезагрузки устройства (также известной как uptime). Чтобы получить его в удобочитаемой для человека форме, вы должны изменить его по результату mach_timebase_info (отношение), которое будет возвращать миллиардные доли секунды (или наносекунды). Чтобы сделать это более удобным, я использую функцию, подобную приведенной ниже:

#include <mach/mach_time.h>

int getUptimeInMilliseconds()
{
    static const int64_t kOneMillion = 1000 * 1000;
    static mach_timebase_info_data_t s_timebase_info;

    if (s_timebase_info.denom == 0) {
        (void) mach_timebase_info(&s_timebase_info);
    }

    // mach_absolute_time() returns billionth of seconds,
    // so divide by one million to get milliseconds
    return (int)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
}
0 голосов
/ 17 июня 2015

Золотым стандартом хронометража являются различные государственные обсерватории времени в США и во всем мире. Они обеспечивают атомное время. Это используется во всем мире. Apple должна использовать это. Если хотите синхронизировать с вышками сотовой связи, должно быть альтернативное внутреннее время. Если вышка или система GPS неисправны, все остаются с неправильным временем.

0 голосов
/ 26 января 2010

Даже если вы можете получить время от GPS, вы должны знать, что Время GPS не совсем совпадает с UTC. Приемник GPS в iPhone может позаботиться об этом за вас.

0 голосов
/ 22 сентября 2009

Возвращает текущую дату и время:

NSDate *now = [NSDate date];

Это будет максимально надежно. Внутренние часы на iPhone будут обновлены, когда он сможет получить доступ к NTP-серверу. Если телефон использует GPS в качестве источника синхронизации времени, он также будет использоваться для обновления тех же системных часов, которые доступны вышеуказанным способом.

Эквивалент CoreFoundation выглядит примерно так:

CFAbsoluteTime now = CFAbsoluteTimeGetCurrent();

Возвращает эквивалент CoreFoundation обычной метки времени UNIX секунд с начала эпохи.

...