自上次应用程序启动以来,如何检测iphone是否已重新启动

时间:2009-09-18 10:04:36

标签: iphone cocoa-touch

我想从我的应用程序中检测到自上次我的应用程序启动以来iPhone是否已重新启动。我需要这样做,因为我的应用程序使用自上次系统重启后的计时器计时用户的时间,我想检测重启,以便我可以使时间无效。

我是否可以从系统控制台日志中提取信息,例如reboot,crashes? xcode中的组织者可以访问它,也许我也可以访问它。

如果没有,你能想到其他方法来获取这些信息吗?

5 个答案:

答案 0 :(得分:10)

这似乎有用:

  • 获取自上次重启以来的时间,对于此示例,让我们将其存储在名为“tslr”的变量中(我猜想持续时间以毫秒为单位,顺便说一下,你怎么做到的?)
  • 获取当前时间,将其存储在变量'ct'中,例如
  • 计算上次重启时间(让我们称之为'lr'),我们有:lr = ct - tslr
  • store'lr'

下次你的应用程序启动时,加载'lr'的先前值,计算新值,如果它们不同,你已经检测到重新启动(你可能不得不容忍那里的一小部分......也许几毫秒。

我认为愚弄这一点非常困难......用户必须非常精确地篡改他们的手机时间,并且他们必须在非常精确的时刻启动您的应用程序,正好在新的时候'lr'将与前一个相同......很难做到,我认为他们能够做到这一点的概率非常接近0。你不需要任何互联网连接就可以做到这一点......

在以下情况下,新的'lr'将与前一个相同:

  • 手机没有重启,时间没有改变
  • 时间被篡改了,并且用户设法以精确的毫秒启动你的应用程序来欺骗你的算法(这种情况发生的可能性超过了超级)

答案 1 :(得分:1)

佐兰的回答是正确的方法;它是没有网络连接的最接近的。 (出于安全原因,无法访问蜂窝子系统和syslog)

如果您希望防止恶意用户生成虚假时间数据,请让一些中央服务器(或企业部署的可信本地服务器)跟踪时间相关事件。

答案 2 :(得分:1)

    // Returns true if device has rebooted since last time
    private func deviceRebootedSinceLastTime() -> Bool {
        let userDefaults = NSUserDefaults.standardUserDefaults()
        let systemUptime = NSProcessInfo.processInfo().systemUptime;
        let timeNow = NSDate().timeIntervalSince1970
        let dateOfLastReboot = NSDate(timeIntervalSince1970: timeNow-systemUptime)

        var didDeviceRebootSinceLastTime = false

        if let storedDateOfLastReboot:NSDate = userDefaults.objectForKey("deviceLastRebootDate") as? NSDate {

            if Int(dateOfLastReboot.timeIntervalSinceDate(storedDateOfLastReboot)) < 1 { //
                print("Reboot time didn't change - date: \(dateOfLastReboot)");
            }
            else {
                print("Reboot time has changed - from: \(storedDateOfLastReboot) to \(dateOfLastReboot)");
                didDeviceRebootSinceLastTime = true

            }
        }
        else {
            print("Reboot time is saved for the first time")
            didDeviceRebootSinceLastTime = true // first time we save value
        }

        userDefaults.setObject(dateOfLastReboot, forKey: "deviceLastRebootDate")
        userDefaults.synchronize() // don't forget this!!!

        return didDeviceRebootSinceLastTime;
    }

答案 3 :(得分:0)

从iPhone或NIST获取并保存时间,从BSD正常运行时间功能获取当前运行时间。对于NIST时间,请参阅How can I get the real time in iPhone, not the time set by user in Settings?

如果要检查重新启动,请获取这些值的新值,计算每个值的已用时间并比较经过的时间。根据差异,您应该能够确定重新启动。

答案 4 :(得分:-1)

这是我做的一个。需要使用GMT中的当前时间以及自上次重启以来的时间来推断设备上次重启的日期。然后,它使用NSUserDefaults跟踪此日期在内存中。享受吧!

注意:由于您要在上次启动应用程序以来进行检查,因此必须确保在应用程序启动时调用该方法。最简单的方法是在<div id="foo" class="w3-content w3-display-container">...</div> <div id="bar" class="w3-content w3-display-container">...</div> 中调用下面的方法,然后在需要手动检查时调用

+(void)initialize {