9

我正在寻找一种可靠的方式来获得时间。它不能被篡改,它需要离线工作。所以没有互联网时间,设置中没有用户时间设置,并且自上次重启以来没有 BSD 正常运行时间。我想知道由于 GPS 使用原子钟工作,我是否可以访问该信息。

谢谢

4

5 回答 5

7

这可以获取 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)尝试了这段代码,即使这样它也给出了时间。但不幸的是,这个时间似乎随着系统时钟的变化而变化。啊。

我发现有趣的事情(仍处于飞行模式)是,如果您篡改系统时钟(在转到offTime & Date'sSet Automatically之后),然后Set Automatically返回on,机器会顺利恢复真实(原始)时间。即使在循环手机电源后也可以使用。因此,设备内部似乎有类似防篡改的时间。但是如何访问这个?

PS从 2010 年开始对此进行讨论。倒数第二条评论的作者在辐射避难所中尝试了这个:所以很明显,手机没有从任何外部来源获得原始时间。

附录,2013 年 7 月

找到了更多关于另一种时间度量的帖子(这里这里这里):系统内核启动时间。它是通过类似这样的调用来访问的:sysctlbyname("kern.boottime", &boottime, &size, NULL, 0);. 不幸的是,即使没有重新启动,它也会随着用户调整的数据和时间而变化。另一个功能gettimeofday()同样依赖于用户定义的时间。

于 2013-07-01T20:38:52.330 回答
4

NSDate 和它的 CF 对应物都是基于用户可控的时间,因此不能防篡改。

据我所知,没有直接用于 GPS 时间或载波时间的开放 API。但是,您可以检查 mach_absolute_time 以获取自上次启动以来未篡改的时间,并且也许使用它来至少了解自应用程序被唤醒以来已经过去了多少时间(没有可能在这段时间被篡改而应用程序正在运行)。

mach_absolute_time 取决于设备的处理器。它返回自设备上次重新启动以来的滴答声(也称为正常运行时间)。为了以人类可读的形式获得它,您必须通过 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));
}
于 2011-01-20T23:37:55.893 回答
0

即使您可以从 GPS 中获取时间,您也应该知道GPS 时间与 UTC 时间并不完全相同。不过,iPhone 中的 GPS 接收器可能会为您解决这个问题。

于 2010-01-26T10:16:25.063 回答
-1

这将为您提供当前日期和时间:

NSDate *now = [NSDate date];

这将尽可能可靠。iPhone 上的内部时钟将在可以访问 NTP 服务器时进行更新。如果手机使用 GPS 作为时间同步源,它还将用于更新可通过上述方法访问的同一系统范围的时钟。

CoreFoundation 等价物类似于:

CFAbsoluteTime now = CFAbsoluteTimeGetCurrent();

它返回与正常 UNIX seconds-since-epoch 时间戳等效的 CoreFoundation。

于 2009-09-22T01:40:16.680 回答
-1

计时的黄金标准是美国和世界各地的各种政府时间观测站。它们提供原子时间。这是世界范围内使用的。苹果应该使用它。如果想要与手机信号塔同步,应该有一个备用内部时间。如果塔台或 GPS 系统出现故障,所有时间都会不正确。

于 2015-06-17T15:04:18.260 回答