Objective c NSDate:获得与设备时钟无关的精确时间?
可能重复:Objective c NSDate:获得与设备时钟无关的精确时间?,objective-c,ios,nsdate,Objective C,Ios,Nsdate,可能重复: 简介 我正在使用一个基于自动续费订阅的应用程序。当应用程序收到苹果公司的最新收据时,它会存储expires\u date\u ms输入NSUserDefaults。30天后,该应用程序会与苹果公司核实订阅是否仍然有效。该应用程序可以被视为离线应用程序,但必须每30天连接一次互联网才能检查订阅状态。此时间比较将用于告诉用户他/她必须连接 问题 我使用下面的代码将当前时间与过期日期进行比较: NSTimeInterval expDateMS = [[productInfo obje
简介 我正在使用一个基于自动续费订阅的应用程序。当应用程序收到苹果公司的最新收据时,它会存储
expires\u date\u ms
输入NSUserDefaults
。30天后,该应用程序会与苹果公司核实订阅是否仍然有效。该应用程序可以被视为离线应用程序,但必须每30天连接一次互联网才能检查订阅状态。此时间比较将用于告诉用户他/她必须连接
问题
我使用下面的代码将当前时间与过期日期进行比较:
NSTimeInterval expDateMS = [[productInfo objectForKey:@"expires_date_ms"] doubleValue];
NSTimeInterval currentDateMS = ([[NSDate date] timeIntervalSince1970] * 1000);
if (currentDateMS > expDateMS)
subExpired = YES;
这很好,效果也很好,但从我所知,有一个漏洞可以利用-如果用户将设备的时钟设置回一小时/月/十年,时间比较将变得不可靠,因为[NSDate date]
使用设备的当前时间(如果我错了,请纠正我)
问题
有没有办法以毫秒为单位检索与设备无关的时间?一个可以准确可靠地测量,而不考虑设备时钟的设备?您需要连接到可靠的官方时间服务器或从中检索信息,并在应用程序中使用该时间数据。例如,没有不可变的设备时钟会在重新启动期间持续存在。获得可靠时间的唯一方法是联系您信任的远程服务器,询问其时间。以下是我可以想到的三个选项:
时钟获取时间(时钟单调)
获取当前系统正常运行时间。这是相对不可靠的,因为如果用户重新启动,这将被重置。您可以保存上次使用的值,并在启动时将上次保存的值用作偏移量,但问题是无法计算设备关闭的时间mach\u absolute\u time()
统计自上次重新启动以来的CPU滴答数。它可以通过CACurrentMediaTime
轻松获取。请注意,只需重新启动设备即可重置,因此,如果更改时间非常重要,我不确定您是否会这样做因此,前两种方法不需要连接,而第三种方法需要连接。然而,第三种方法是唯一万无一失的。虽然Kevin和H2CO3是完全正确的,但还有其他解决方案用于检查订阅(我希望不需要毫秒精度……) 首先观察
UIApplicationsSignificantTimeChangeNotification
,以便在时间突然变化时获得通知。如果你被停职,这甚至会被发送给你(尽管我不相信如果你被终止,你会收到它)。当有载波时间更新时会调用它,我相信当有手动时间更新(检查)时会调用它。它也被称为在当地午夜和在DST的变化。关键是,当时间突然改变时,它经常被调用
记录你进入后台的时间。跟踪你回到前台的时间。如果时间急剧倒退(超过一两天),请建议您访问网络检查情况。无论何时您使用服务器签入,它都应该告诉您它认为是什么时间。您可以使用它来同步系统
同样,您可以跟踪实际运行时。如果它与明显的运行时严重不同步,那么再次请求访问网络以同步
我敢肯定,攻击者可以从这个系统中潜入35天或任何时间,而不是30天,但任何人只要愿意努力工作,就会破解你的软件,并彻底检查。这里的重点是未承诺的攻击者,他只是在摆弄他们的时钟。而且你能抓得很好
您应该仔细地测试这一点,并且在指责用户任何事情时都要非常犹豫。仅连接到服务器就足以让合法用户再次工作。嗨,安东尼,在满足所有要求的几天内,您是否已经实现了这一点,获得了与设备时间无关的精确时间谢·安东尼,这对您来说是一个有点离题的问题,您为什么要乘以
[[NSDate date]timeIntervalSince1970]
千倍?