Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSDate:获得与设备时钟无关的精确时间?_Objective C_Ios_Nsdate - Fatal编程技术网

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
    轻松获取。请注意,只需重新启动设备即可重置,因此,如果更改时间非常重要,我不确定您是否会这样做

  • 网络时间协议(NTP)是一种用于同步计算机系统时钟的网络协议。实际上,所有NTP都是查询时间服务器。可以找到NTP的iOS库


  • 因此,前两种方法不需要连接,而第三种方法需要连接。然而,第三种方法是唯一万无一失的。

    虽然Kevin和H2CO3是完全正确的,但还有其他解决方案用于检查订阅(我希望不需要毫秒精度……)

    首先观察
    UIApplicationsSignificantTimeChangeNotification
    ,以便在时间突然变化时获得通知。如果你被停职,这甚至会被发送给你(尽管我不相信如果你被终止,你会收到它)。当有载波时间更新时会调用它,我相信当有手动时间更新(检查)时会调用它。它也被称为在当地午夜和在DST的变化。关键是,当时间突然改变时,它经常被调用

    记录你进入后台的时间。跟踪你回到前台的时间。如果时间急剧倒退(超过一两天),请建议您访问网络检查情况。无论何时您使用服务器签入,它都应该告诉您它认为是什么时间。您可以使用它来同步系统

    同样,您可以跟踪实际运行时。如果它与明显的运行时严重不同步,那么再次请求访问网络以同步

    我敢肯定,攻击者可以从这个系统中潜入35天或任何时间,而不是30天,但任何人只要愿意努力工作,就会破解你的软件,并彻底检查。这里的重点是未承诺的攻击者,他只是在摆弄他们的时钟。而且你能抓得很好


    您应该仔细地测试这一点,并且在指责用户任何事情时都要非常犹豫。仅连接到服务器就足以让合法用户再次工作。

    嗨,安东尼,在满足所有要求的几天内,您是否已经实现了这一点,获得了与设备时间无关的精确时间谢·安东尼,这对您来说是一个有点离题的问题,您为什么要乘以
    [[NSDate date]timeIntervalSince1970]
    千倍?