我正在尝试设计一个实时事件发生的系统,我想将它们与时钟同步. [NSDate date]通常可以,但用户可以改变这一点并欺骗系统.我需要的是一个时钟,我可以从相对时间(例如64位计数器) - 我不需要绝对时间(或一天中的时间等).
我可以使用这样的API吗?
编辑:我还想补充一点,这个时钟需要在应用程序的会话上持久化.
在iOS中,我需要知道实际时间(UTC),而不是设备的时间.换句话说,用户不应该篡改时间或日期.
任何需要网络连接的东西都不好(因此不能选择访问时间服务器).
AFAIK,有两种理论方法可以达到这个目的:
问题是iOS中的任何API都不会公开此信息.
还有另外一种方法吗?
我正在编写一个Cocoa OS X(Leopard 10.5+)最终用户程序,该程序使用时间戳来计算屏幕上显示内容的统计信息.使用重复的NSTimer运行程序时,会定期计算时间. [NSDate date]用于捕获时间戳,开始和结束.以秒为单位计算两个日期之间的差异是微不足道的.
如果最终用户或ntp更改系统时钟,则会出现问题. [NSDate date]依赖于系统时钟,因此如果它被改变,Finish变量将相对于Start变形,从而显着地搞乱了时间计算.我的问题:
1. 即使系统时钟在中途改变,如何准确计算开始和结束之间的时间(以秒为单位)?
我想我需要一个不变的参考时间点,所以我可以计算从那以后经过了多少秒.例如,系统正常运行时间.具有10.6 - (NSTimeInterval)systemUptime的一部分NSProcessInfo,它提供了系统正常运行时间.但是,这不起作用,因为我的应用程序必须在10.5中工作.
我尝试使用NSTimer创建时间计数器,但这不准确.NSTimer有几种不同的运行模式,一次只能运行一种.NSTimer(默认情况下)进入默认运行模式.如果用户开始操作UI足够长的时间,这将进入NSEventTrackingRunLoopMode并跳过默认运行模式,这可能导致跳过NSTimer激活,使其成为计算秒数的不准确方式.
我还考虑过创建一个单独的线程(NSRunLoop)来运行NSTimer秒计数器,使其远离UI交互.但我对多线程非常陌生,如果可能的话,我想远离它.此外,我不确定这是否会在CPU被另一个应用程序(Photoshop渲染大图像等等)绑定的情况下准确工作,导致我的NSRunLoop被搁置足够长的时间以使其陷入困境的NSTimer.
我感谢任何帮助.:)
可能重复:
如何在应用程序运行之间本地检测用户的iPhone时钟进度?
有没有办法确定iOS中的实际时间和日期(不是设备的时间)
iOS中是否有可以使用的时钟,用户无法更改
我正在使用基于订阅的自动续订应用程序.当应用程序收到Apple的最新收据时,它会将expires_date_ms密钥存储在NSUserDefaults.该日期过后30天,该应用程序会检查Apple以查看订阅是否仍处于活动状态.该应用可被视为离线应用,但必须每30天连接一次互联网才能检查订阅状态.此时间比较将用于告诉用户他/她必须连接.
我使用下面的代码比较当前时间expires_date_ms:
NSTimeInterval expDateMS = [[productInfo objectForKey:@"expires_date_ms"] doubleValue];
NSTimeInterval currentDateMS = ([[NSDate date] timeIntervalSince1970] * 1000);
if (currentDateMS > expDateMS)
subExpired = YES;
Run Code Online (Sandbox Code Playgroud)
这很好并且运行良好,但据我所知,有一个漏洞可以被利用 - 如果用户将设备的时钟设置为一个小时/月/十年,时间比较将变得不可靠,因为[NSDate date]使用设备的当前时间(请如我错了请纠正我).
有没有办法检索与设备无关的时间(以毫秒为单位)?可以准确可靠地测量而无需关注器件时钟的器件?