iOS如何检测用户已更改系统时间,如果没有将设备时间与服务器时间进行比较

时间:2015-09-08 12:24:40

标签: ios swift clock

要求是必须检测用户是否手动更改iPhone的系统时间。为此,我使用了

NSNotificationCenter.defaultCenter().addObserver(self, selector: "timeChangedNotification:", name: NSSystemClockDidChangeNotification, object: nil)

 func timeChangedNotification(notification:NSNotification){
    println("Device time has been changed...")
    }

但没有得到结果。 此外,如果这个时间没有改变意味着它是网络提供的自动时间,那么必须与服务器时间进行比较。如何做到这一点?请为此提供帮助。

4 个答案:

答案 0 :(得分:4)

根据其文档,NSSystemClockDidChangeNotification是:

  

每当系统时钟发生变化时都会发布。这可以通过调用settimeofday()或用户更改“日期和时间首选项”面板中的值来启动。

因此,除非您希望用户在您的应用运行时更改日期或时间,否则您显然不会听到任何声音。通知由事件触发。

iOS没有为您提供一种方式来询问系统认为时间和日期是当前值的权限 - 无论是运营商网络时间,时间服务器时间,用户提供的时间还是其他内容。没有单一的服务器时间,也没有办法要求它。你想做什么是不可能完成的。

答案 1 :(得分:2)

我已经尝试了3个选项来为我所做的企业应用做到这一点,这需要时间始终在用户之间保持同步。由于我们无法控制用户'设置时间的设定,我也面临着你的困境:

选项1 - 使用GPS时间:我尝试获取GPS时间戳并将其与本地设备时间进行比较。它在一些国家有效但在其他国家没有用。其他国家/地区因某种原因返回设备时间。

选项2 - 使用后台流程估算大致时间。无论什么时候你的应用程序进入后台,你所做的就是获取时间戳。运行一个每5分钟触发一次的计时器(+/-取决于您的公差)。然后通过在应用程序变为活动状态时将经过时间戳的5分钟刻度添加到计算估计时间。但是,此方法只能检测您的应用程序运行时是否更改了时间。而不是在你的应用程序开始之前时间已经改变了。

选项3 - 在后端使用时间检查。这就是我最终做的事情。我有一个小的PHP后端程序,它返回UTC时间。所以每次我的应用程序执行或返回到前台时,我的应用程序都会快速检查时间与我的时间服务器。要处理脱机情况,我会在系统进入后台之前存储最后一个时间戳,这样您至少可以检查日期/时间是否已过时。然后在系统上线时再次使用时间服务器进行检查。

到目前为止,这是第三个对我有用的选项。但我想结合2和3甚至可以使系统更加防拉。

答案 2 :(得分:2)

    This code worked for me in Swift 3

    NotificationCenter.default.addObserver(self, selector: #selector(ClassName.timeChangedNotification), name: NSNotification.Name.NSSystemClockDidChange, object: nil)
    }

    // Method get called user changed the system time manually.

    func timeChangedNotification(notification:NSNotification){
        print("Device time has been changed...")
    }

答案 3 :(得分:1)

已经有一段时间了,但是对于将来像我今天一样会发现这个问题的人来说,它可能会有用。

您还可以使用NTP protocol来了解应用进入背景/前景或didFinishLaunching时的真实纪元时间。不过,这要求该应用程序在线。但这在大多数情况下可能会有所帮助。

至少有两个iOS和Android开源库可以提供帮助:TrueTimeKronos