仅在手动更改设备时间时才检测设备时间

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

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

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

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

即使他在午夜之后恢复应用程序(或者可能是他最小化应用程序并进入睡眠状态。第二天他醒来,恢复应用程序并且令人惊讶地获得时间更改通知)。

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

只需使用NSSystemClockDidChangeNotification Apple doc链接即可

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

  1. 获取远程时间。

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

  3. 现在,您可以在检查课程时随时获得“实时”,因为它可以占用当前设备时间,只需添加存储的偏移量,您就可以随时获得实时时间。

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

  5. 对于每个应用程序前台事件,您将不得不再次执行3. 再次获得远程时间。 拒绝任何调用以获得实时,直到您再次获得该偏移。 任何取决于现有实时的调用都必须在那些尚未提取实时的事件中正常失败。

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

Afaik,我总是使用UTC时间戳来避免任何现场问题。

用服务器时间检查这些东西总是更好。

请遵循以下步骤。

  1. 获取服务器时间并转换为当前区域设置。

  2. 使用当前区域设置检查移动时间。

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

如果这是明确的,请告诉我。