我需要确保我的应用获得正确的时间,而不是用户在设置中设置的时间。
因此,例如,一旦用户启动应用程序,我就想获得一个时间戳。用户将看到每秒更新屏幕上的计时器的经过时间。当用户退出应用程序,并在一段时间后重新启动应用程序时,计时器将获取当前时间并将其与其保留的原始时间戳进行比较。所以基本上就像iPhone上的Clock.App中的秒表一样。
现在clock.app的问题在于,如果用户将设置中的时间提前一小时,则会影响计时器。显然我不希望这样,因为在我的应用程序中,这将是作弊。
我需要获得一个更值得信赖的时间源来进行比较。
我可以从互联网上获取时间。但问题是我需要互联网连接,所以只有在有互联网连接时才能使用。我的应用程序需要优先离线工作。
我可以访问某种内部时钟吗?
有没有办法检查用户是否更改了设置中的日期时间?
还有其他想法吗?
由于
答案 0 :(得分:1)
从NIST获得白天协议的时间:
基于UDP的日间服务 服务器在UDP端口13上侦听UDP数据报。收到数据报时,会发送一个应答数据报,其中包含当前日期和时间作为ASCII字符串(忽略接收数据报中的数据)。
NIST响应格式:JJJJJ YR-MO-DA HH:MM:SS TT L H msADV UTC(NIST)OTM
答案 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];