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

时间:2013-07-03 00:06:25

标签: iphone ios objective-c datetime

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

  

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

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

  

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

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

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

3 个答案:

答案 0 :(得分:2)

只需使用NSSystemClockDidChangeNotification Apple doc link

答案 1 :(得分:1)

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

  1. 获取远程时间。

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

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

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

  5. 对于每个应用前景事件,您必须再次执行3.再次获得远程时间。拒绝任何调用以获得实时,直到您再次获得该偏移。在尚未提取实时的事件中,任何取决于现有实时的呼叫都必须优雅地失败。

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

  7. Afaik,我总是使用UTC时间戳来避免任何现场故障。

答案 2 :(得分:0)

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

按照以下步骤操作。

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

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

  3. 如果它们不相同,则表示用户已更改时间。

  4. 请告诉我这是否清楚。