【问题标题】:How can I get the real time in iPhone, not the time set by user in Settings?如何在 iPhone 中获取实时时间,而不是用户在“设置”中设置的时间?
【发布时间】:2009-09-18 09:01:57
【问题描述】:

我需要确保我的应用获得正确的时间,而不是用户在设置中设置的时间。

因此,例如,一旦用户启动应用程序,我想获得一个时间戳。用户会在屏幕上的计时器上看到经过的时间每秒更新一次。当用户退出应用程序并在一段时间后重新启动应用程序时,计时器将获取当前时间并将其与保留的原始时间戳进行比较。所以基本上,就像 iPhone 上 Clock.App 中的秒表一样。

现在clock.app 的问题是,如果用户将设置中的时间提前一小时,这将影响计时器。显然我不希望这样,因为在我的应用中,那将是作弊。

我需要找一个更可靠的时间来源进行比较。

我可以从互联网上获取时间。但问题是我需要互联网连接,所以只有在有互联网连接的情况下才能工作。我的应用需要最好离线工作。

我可以访问某种内部时钟吗?

有没有办法检查用户是否在设置中更改了日期时间?

还有其他想法吗?

谢谢

【问题讨论】:

  • 我不小心把实时... 很糟糕?
  • 能否从 GPS 获取时间?
  • 您将需要从一些外部来源(NIST、GPS、手机系统,甚至可能通过数据包嗅探其他人流量的数据包)获取时间,因为任何内部时钟都可以搞砸了。 OTOH,如果您不信任用户,您甚至不应该在客户端的系统上执行此操作。
  • 因为我的应用程序可能在非常偏远的地区使用,我不能依赖 GPS 以外的外部资源。不幸的是 GPS API 没有公开原子钟时间戳。我有一个马赫计时器的解决方案。
  • @Maxm007 你有解决办法吗??

标签: iphone cocoa-touch iphone-sdk-3.0 date time


【解决方案1】:

使用日间协议从 NIST 获取时间:

基于 UDP 的日间服务 服务器在 UDP 端口 13 上侦听 UDP 数据报。当接收到数据报时,会发送一个应答数据报,其中包含作为 ASCII 字符串的当前日期和时间(接收到的数据报中的数据被忽略)。

NIST 响应格式:JJJJJ YR-MO-DA HH:MM:SS TT L H msADV UTC(NIST) OTM

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

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

【讨论】:

  • 您好,由于我的应用需要离线工作,因此无法使用互联网时间。
【解决方案2】:

我想出的最佳解决方案是使用自上次 iphone 启动以来计算时间单位的马赫计时器。

这很好用。唯一的限制是不允许用户重新启动,否则会使他的时间无效。

我通过最初存储与马赫计时器关联的 iphone 时间戳来检测重启,然后在每次应用启动时进行检查,因此它没有改变。这样做的副作用是,如果用户在计时时更改 iPhone DateTime,也会使分数无效,但没关系。

How can I detect whether the iphone has been rebooted since last time app started

我可以很容易地警告我的用户:在您上班时重新启动或更改 iphone 时间将使您的得分时间无效。

【讨论】:

    【解决方案3】:

    我刚刚发布了以下here

    这可以获取 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,机器可以顺利恢复真实(原始)时间。即使在循环手机电源后也可以使用。因此,似乎存在设备内部维护的防篡改时间。但是如何访问呢?

    【讨论】:

    • 此方法只会从设备设置中设置日期和时间
    【解决方案4】:

    这个方法会找到实际的当前时间,在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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-19
      • 2015-10-24
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多