我正在尝试设计一个实时事件发生的系统,我想将它们与时钟同步。 [NSDate date]
通常可以,但用户可以更改此设置并欺骗系统。我需要的是一个时钟,我可以从相对时间(例如64位计数器) - 我不需要绝对时间(或时间等)。
我可以使用这样的API吗?
编辑:我还想补充一点,这个时钟需要在应用程序的会话中保持持久。
答案 0 :(得分:9)
iPhone上单调增加的最佳数字是mach_absolute_time()
,这是自上次重启以来的CPU滴答数。如果您因任何原因希望在几秒钟内完成,则可以使用CACurrentMediaTime()
轻松获取。
使用它来创建“始终增量”非常简单。首次启动时,将当前值存储在您喜欢的任何位置。退出时,定期保存该值的偏移量。重启时,检查当前值;如果它小于您之前的基值,请替换您的基值(重新启动)。
除非您在服务器上存储内容,否则可以通过删除您的应用来清除所有这些。
请注意,这不能用作强大的安全措施。无法阻止授权用户伪造请求。因此,根据“欺骗系统”的含义,它可能不是一个可解决的问题。你能做的最好的事情就是不断寻找黑客并处理它们。
答案 1 :(得分:6)
如果您只需要一个时钟来测量事件的单调递增,那么您可以获得当前系统的正常运行时间clock_gettime(CLOCK_MONOTONIC)
。如果重新启动设备是个问题,只需保存最后使用的值,并在下次启动时使用上次保存的值作为偏移量。这里的问题可能是,如果他们实际关闭了设备,它将不计算那个时间。但如果你担心用户加快时间,他们就不能这样做,只会减慢速度。
答案 2 :(得分:6)
我在我们的应用程序中使用它
+ (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;
}
答案 3 :(得分:5)
我认为mach_absolute_time()
可能是你想要的。这里有很多信息:http://developer.apple.com/library/mac/#qa/qa1398/_index.html
它基本上是自设备启动以来的滴答数量的计数器。这将在重启时重置,但除此之外,它是一个单调增加的计数器。
如果计数器自上次(设备重新启动)以来已减少,您可以保留计数器的最后一个值并处理它。在这种情况下,您可以将最后的已知值添加到当前值以获得已经过去的时间的下限,您丢失的是上次会话和设备关闭之间的时间,您将保持时间间隔重启和下一次会议。
答案 4 :(得分:3)
我所知道的是,没有任何其他方法可以获得正确的时间。我会使用 NTP。
网络时间协议(NTP)是一种网络协议,用于通过分组交换,可变延迟数据网络同步计算机系统的时钟。更多:http://en.wikipedia.org/wiki/Network_Time_Protocol
在一个项目中,我将使用 NTP (明天我会),但我已经做了一些研究:
iOS库: https://github.com/jbenet/ios-ntp - 作者注意:实施并不像那些RFC中所描述的那样严格,因为目标是在一秒钟内提高时间精度,而不是分数毫秒。
对于非商业项目,请访问:www.packages.ubuntu.com/source/lucid/ntp
C库: www.hillstone-software.com/hs_ntp_details.htm
文档: www.nist.gov/pml/div688/grp40/its.cfm
答案 5 :(得分:1)
我能想到的唯一想法是使用NTP服务器来获取时钟,但这需要网络连接。