如何在iPhone中获取实时,而不是用户在“设置”中设置的时间?

时间:2009-09-18 09:01:58

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

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

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

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

我需要获得一个更值得信赖的时间源来进行比较。

我可以从互联网上获取时间。但问题是我需要互联网连接,所以只有在有互联网连接时才能使用。我的应用程序需要优先离线工作。

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

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

还有其他想法吗?

由于

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

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

我可以轻松地向用户发出警告:在您上班时重启或更改iphone时间会使您的得分时间无效。

答案 2 :(得分:0)

我刚刚发布了以下here

这可以获得GPS时间:

#import <CoreLocation/CoreLocation.h>

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

但它似乎并不是防篡改的。

我在飞机模式(iOS 6.1)的iPhone 4上尝试了这个代码,即使这样,它也可以提供时间。但不幸的是,这一次似乎随系统时钟而变化。啊。

我发现(仍在飞行模式下)有趣的是,如果您篡改系统时钟(转到off时间和日期Set Automatically后),然后转{{1}返回Set Automatically,机器可以毫无障碍地恢复真实(原始)时间。即使在手机电源循环后,这也能正常工作。所以似乎 类似于设备内部维护的防篡改时间。但是如何访问这个?

答案 3 :(得分:0)

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