2

问题:我知道applicationSignificantTimeChange检测手动时间变化的方法。但是方法文档说:

重大时间变化的示例包括午夜的到来、运营商的时间更新以及夏令时的变化。委托可以实现此方法来调整应用程序中显示时间或对时间变化敏感的任何对象。

因此,它不仅可以检测到手动时间更改,还可以检测到午夜的到来。在我的应用程序中,这将产生一个问题,因为用户将看到一个警报框:

你已经改变了时间。请恢复到实际时间。

即使他在午夜后恢复应用程序(或者可能是他最小化应用程序并进入睡眠状态。第二天他醒来,恢复应用程序并意外地收到时间更改通知)。

问题:如何仅在手动更改时间而不是在午夜到来时显示警报?

4

3 回答 3

1

只需使用NSSystemClockDidChangeNotification Apple 文档链接

于 2015-03-12T10:56:11.460 回答
1

我已经使用远程服务器时间检查的变体一年或几年了。它在 iOS 上运行良好。

  1. 获取远程时间。

  2. 在您的时间检查类中,存储远程时间和设备时间之间的偏移量,并将其存储在一个简单的 NSTimeInterval 变量中。

  3. 现在,您可以随时从时间检查类中获取“实时”,因为它可以占用当前设备时间,只需添加存储的偏移量,您就可以一直拥有实时时间。

  4. 每当应用程序背景时,您都需要删除存储的偏移量,因为用户可能会摆弄时间设置。

  5. 对于每个应用程序前台事件,您都必须再次执行 3.。再去远程时间。拒绝任何获取实时的调用,直到您再次获得该偏移量。在那些尚未获取实时的事件中,任何依赖于现有实时的调用都必须优雅地失败。

  6. 现在您应该/可以将您获得的偏移量与您上次获得的偏移量进行比较。确定一个阈值,例如 15 秒。如果与上次的偏移变化超过该阈值,则用户可能会手动更改时间。这对我来说是一个有用的事件。当然,即使用户可以更改设备时间,我也总是可以方便地使用实时时间(大部分时间)。

Afaik,我总是使用 UTC 时间戳来避免任何语言环境问题。

于 2015-06-02T23:27:44.727 回答
0

总是最好用服务器时间检查这些事情。

请按照以下步骤操作。

  1. 获取服务器时间并转换为当前语言环境。

  2. 使用当前语言环境检查移动时间。

  3. 如果它们不相同,则意味着用户更改了时间。

让我知道这是否清楚。

于 2015-03-12T11:34:17.977 回答