我正在尝试设计一个实时事件发生的系统,我想让它们与时钟同步。[NSDate date]
通常是可以的,但是用户可以更改这一点并欺骗系统。我所需要的是一个时钟,我可以从(例如64位计数器)获取相对时间-我不需要绝对时间(或一天中的时间等)。
有没有这样的API我可以使用?
编辑:我还想补充说,这个时钟需要在应用程序的会话中持久化。
发布于 2012-07-10 21:08:37
如果您只需要一个时钟来测量单调递增的事件,那么您可以只获得当前系统的正常运行时间和clock_gettime(CLOCK_MONOTONIC)
。如果重启设备有问题,只需保存上次使用的值,并在下次启动时使用上次保存的值作为偏移量。这里的问题可能是,如果他们真的关闭了设备,它将不会计入这段时间。但是如果你担心用户加速时间,他们不能这样做,只能减慢速度。
发布于 2012-07-10 21:05:50
iPhone上最好的单调递增数字是mach_absolute_time()
,它是自上次重新启动以来的CPU计时计数。如果您出于任何原因想要在几秒钟内获得它,那么使用CACurrentMediaTime()
获取它是最容易的。
使用它来创建一个“总是增量”是非常简单的。在第一次启动时,将当前值存储在您喜欢的任何位置。退出时,定期保存该值的偏移量。当您重新启动时,检查当前值;如果它小于您以前的基本值,请替换您的基本值(已重新启动)。
当然,所有这些都可以通过删除你的应用程序来清除,除非你在服务器上存储了一些东西。
请注意,这不能用作强大的安全措施。没有办法阻止授权用户伪造请求。因此,根据您所说的“欺骗系统”的意思,这可能不是一个可解决的问题。你所能做的最好的事情就是不断地勤奋地寻找黑客并处理他们。
发布于 2012-07-10 21:46:18
我在我们的应用程序中使用了这个
+ (NSDate *) getAWSDate
{
NSDate *today = nil;
NSString *dateString = nil;
NSString *awsURL = @"http://s3.amazonaws.com";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:awsURL]];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL];
if ([response respondsToSelector:@selector(allHeaderFields)]) {
dateString = [[response allHeaderFields] objectForKey:@"Date"];
dateString = [dateString stringByReplacingOccurrencesOfString:@"GMT" withString:@"+0000"];
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";
df.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
today = [df dateFromString:dateString];
[df release];
}
return today;
}
https://stackoverflow.com/questions/11413616
复制相似问题