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

Poo*_*nam 8 clock ios swift

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

NSNotificationCenter.defaultCenter().addObserver(self, selector: "timeChangedNotification:", name: NSSystemClockDidChangeNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)

 func timeChangedNotification(notification:NSNotification){
    println("Device time has been changed...")
    }
Run Code Online (Sandbox Code Playgroud)

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

Sud*_*135 7

    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...")
    }
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 6

根据其文档,NSSystemClockDidChangeNotification是:

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

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

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


小智 5

我已经尝试了 3 个选项来为我所做的企业应用程序执行此操作,该应用程序需要时间在用户之间始终保持同步。由于我们无法控制用户对设备时间的设置,我也遇到了你的困境:

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

选项 2 - 使用后台进程来估计大概时间。您所做的是在您的应用程序进入后台时获取时间戳。运行一个每 5 分钟触发一次的计时器(+/- 取决于您的容忍度)。然后通过在您的应用程序变为活动状态时将经过的 5 分钟滴答添加到存储的时间戳来计算估计时间。但是,这种方法只能检测在您的应用程序已经运行时是否更改了时间。如果在您的应用程序启动之前更改了时间,则不会。

选项 3 - 在后端使用时间检查。这就是我最终做的。我有一个小的 php 后端程序,它返回 UTC 时间。因此,每次我的应用程序执行或返回前台时,我的应用程序都会根据我的时间服务器快速检查时间。为了处理离线情况,我在系统进入后台之前存储了最后一个时间戳,因此您至少可以检查日期/时间是否已回溯。然后在系统上线时再次检查时间服务器。

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