NSDate:获取与设备时钟无关的精确时间?

Ant*_*ony 8 objective-c nsdate ios

可能重复:
如何在应用程序运行之间本地检测用户的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]使用设备的当前时间(请如我错了请纠正我).

有没有办法检索与设备无关的时间(以毫秒为单位)?可以准确可靠地测量而无需关注器件时钟的器件?

小智 6

您需要从可靠的官方时间服务器连接/检索信息,并在您的应用程序中使用该时间数据.例如,这是一个具有易于使用的API的世界时间服务器


Rob*_*ier 6

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

首先观看,UIApplicationSignificantTimeChangeNotification以便您收到时间突然变化的通知.如果你被停职,这甚至会被送到你手中(虽然如果你被终止我不相信你会收到它).当有载波时间更新时会调用它,我相信当有手动时间更新(检查)时会调用它.它也会在当地午夜和DST更改时调用.关键是当时间突然改变时,它经​​常被调用.

跟踪你进入后台的时间.跟踪回到前台的时间.如果时间从根本上向后移动(超过一天或两天),请建议您访问网络以检查事物.每当您使用服务器办理登机手续时,都应该告诉您它认为的时间.您可以使用它来同步系统.

您可以类似地跟踪您的实际运行时间.如果它与明显的运行时变得非常不同步,那么请再次请求访问网络以进行同步.

我确信攻击者可以在这个系统中潜行35天或者其他任何东西,而不是30天,但是任何愿意努力工作的人都会破解你的软件并完全退出.这里的重点是未提交的攻击者只是搞乱他们的时钟.而你可以很好地抓住.

你应该仔细测试,并且非常犹豫地指责用户什么.只需连接到您的服务器就足以让合法用户再次工作.