iOS中是否有可供用户更改的时钟?

我试图devise一个系统,实时事件发生,我想同步到一个时钟。 [NSDate date]通常是正常的,但用户可以改变这一点,并欺骗系统。 我所需要的只是一个时钟,我可以从相对的时间(例如一个64位计数器) – 我不需要绝对时间(或一天的时间等)。

有我可以使用的API吗?

编辑:我也想补充说,这个时钟需要持久性的应用程序的会话。

如果你只需要一个时钟来测量单调递增的事件,那么你可以得到当前系统的正常运行时间ala clock_gettime(CLOCK_MONOTONIC) 。 如果重新启动设备存在问题,只保存上次使用的值,并在下次启动时使用上次保存的值作为偏移量。 这里的问题可能是,如果他们实际上closures了设备,则不会计入那个时间。 但如果你担心用户加速时间,他们不能这样做,只能放慢速度。

iPhone上最好的单调增加的数字是mach_absolute_time() ,它是自上次重新启动以来的CPU滴答数量。 如果您因为任何原因在几秒钟内想要它,那么使用CACurrentMediaTime()可以非常容易地获取它。

使用这个来创build一个“永远增量”是非常容易的。 第一次启动时,将当前值存储在任何你喜欢的地方。 当您退出时,并定期保存该值的偏移量。 当你重新启动时,检查当前值; 如果它小于以前的基准值,则更换基准值(重新启动)。

所有这些当然可以通过删除你的应用程序来清除,除非你在服务器上存储了一些东西。

请注意,这不能用作强有力的安全措施。 没有办法阻止授权用户伪造请求。 因此,根据“欺骗系统”的含义,这可能不是一个可以解决的问题。 你所能做的最好的是不断努力寻找黑客并与他们打交道。

我正在使用这个在我们的应用程序

 + (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; } 

我认为mach_absolute_time()可能是你想要的。 这里有相当多的信息: http : //developer.apple.com/library/mac/#qa/qa1398/_index.html

它基本上是自设备启动以来的滴答数量的计数器。 这将重新启动时重置,但除了它是一个单调递增的计数器。

如果计数器自上次(设备重新启动)以来已减less,则可以将计数器的最后一个值保留在周围并进行处理。 在这种情况下,您可以将最后一个已知值添加到当前值以获得已经过去的时间的下限,所有您将丢失的是上次会话和设备closures之间的时间,尽pipe重启和下一个会话。

我所知道的,没有任何其他的方法来获得正确的时间。 我会使用NTP。

networking时间协议(NTP)是一种networking协议,用于通过分组交换,可变延迟数据networking同步计算机系统的时钟。 更多: 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库: http://www.hillstone-software.com/hs_ntp_details.htm

文档: http://www.nist.gov/pml/div688/grp40/its.cfm

我能想到的唯一想法是使用NTP服务器来获取时钟,但是这需要networking连接。