iOS如何检测用户已经改变了系统时间,如果没有比较设备时间与服务器时间

要求是必须手动更改iPhone的系统时间。 对于我已经使用

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

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

但没有得到结果。 而且如果这个时间没有改变,意味着它是由networking提供的自动时间,那么必须和服务器时间比较。如何做到这一点? 请给予同样的帮助。

根据其文档, NSSystemClockDidChangeNotification是:

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

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

iOS不提供一种方法来询问系统相信时间和date是当前值的权限 – 无论是运营商networking时间,服务器时间,用户提供的时间还是其他内容。 没有单一的服务器时间,没有办法要求。 你想做什么不能做。

我已经尝试了3个选项来为我所做的企业应用程序执行此操作,这需要时间始终跨用户同步。 由于我们无法控制用户对设备时间的设置,我也面临着您的困境:

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

选项2 – 使用后台进程估计大致的时间。 你所做的是获得时间戳,只要你的应用程序进入后台。 运行一个定时器,每5分钟发一次(+/-取决于你的容忍度)。 然后通过在应用程序激活时添加存储的时间戳的5分钟记号来计算估计的时间。 但是,这种方法只能检测到,如果您的应用程序已经运行,时间已经改变。 而且,如果在你的应用程序开始之前更改时间

选项3 – 在后端使用时间检查。 这就是我最终做的。 我有一个小的PHP后端程序,返回UTC时间。 所以每当我的应用程序执行或返回到前台,我的应用程序将快速检查时间对我的时间服务器。 为了处理离线情况,我在系统进入后台之前存储最后的时间戳,以便至less检查date/时间是否过期。 然后在系统上线时再次检查时间服务器。

到目前为止,这是我的第三个select。 但是我认为2和3的结合会使系统更加拉动。

  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...") }