2009-09-18 79 views
4

我想從我的應用程序中檢測iPhone是否自上次啓動以來已重新啓動。我需要這樣做,因爲我的應用程序在上次系統重啓後使用計時器來計時用戶的時間,並且我想檢測重啓,以便使時間無效。如何檢測自上次啓動應用程序後iPhone是否已重新啓動

是否有任何地方我可以從系統控制檯日誌中提取信息,如重新啓動,崩潰? xcode中的組織者可以訪問它,也許我也可以。

如果不是,你能想出其他方法來獲取這些信息嗎?

+0

有沒有辦法讓手機操作時間? – Maxm007 2009-09-18 14:08:53

回答

10

這似乎是它的工作:

  • 獲得自從上次重新啓動,並在這個例子中,我們將其存儲在一個名爲「tslr」(時間以毫秒爲單位我想變,順便說一句,怎麼辦你得到)
  • 獲取當前時間,將其存儲在變量「CT」例如
  • 計算最後的重啓時間(我們稱之爲「LR」),我們有:LR =克拉 - tslr
  • store'lr'

下一次您的應用程序開始運行時,加載'lr'的先前值,計算新值,如果它們不同,則檢測到重新啓動(您可能必須容忍一個小的差異... a也許幾毫秒)。

我認爲這很愚蠢,用戶將不得不非常準確地篡改手機時間,他們將不得不在非常精確的時刻開始您的應用程序,新的'lr'將與前一個相同...非常難以做到,他們能夠做到這一點的可能性非常接近0我認爲。你不需要任何互聯網連接這樣做...

新的「LR」將等同於前一個只能在下列情況:

  • 手機沒有重新啓動,和時間沒有改變
  • 時間被篡改,用戶管理的精確毫秒來啓動應用程序來欺騙你的算法
+0

輝煌中更改iPhone時間更安全。完美工作,同時檢測用戶更改iphone日期。現在,如果用戶在沒有網絡連接的情況下進行了篡改,那麼我可以使其無效。 順便說一句:你可以得到自從重新啓動使用馬赫計時器的時間: http://discussions.apple.com/thread.jspa?threadID=1632831 – Maxm007 2009-09-19 21:37:22

+0

嗯,這馬赫計時器是奇怪的。即使我的iPhone整晚都沒有重啓,計時器似乎已經重置。 – Maxm007 2009-09-20 10:05:52

+0

這種方法似乎是一種可靠的方式,在不使用私有API或系統調用的情況下獲得系統正常運行時間:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSProcessInfo_Class/#//apple_ref/occ/instp/NSProcessInfo/systemUptime – 2015-04-07 04:52:29

0

從iPhone或NIST獲取並保存時間,從BSD運行時間函數獲取當前運行時間。對於NIST時間,請參閱How can I get the real time in iPhone, not the time set by user in Settings?

當您要檢查重新啓動時是否獲取這些值的新值時,請計算每個值的耗用時間並比較耗用的時間。根據差異,您應該能夠確定重新啓動。

+0

在我的情況下,這是行不通的,因爲我不能依賴於互聯網連接,並且不能依賴於iPhone時間,因爲這可能會被用戶篡改。 – Maxm007 2009-09-18 13:10:49

+0

用戶也可以篡改你的應用程序。你需要這個有多安全? – Amok 2009-09-18 19:11:44

+0

沒有用戶不能輕易地篡改我的應用程序,因爲它是數字簽名的。它明確地需要比在設置 - >常規 - >時間 – Maxm007 2009-09-18 21:26:58

1

卓然的答案是正確的方式去(即發生超過超薄的機會) ;這是你在沒有網絡連接的情況下最接近的。 (無論是蜂窩子系統,也沒有系統日誌是出於安全原因無法訪問)

如果您正在尋找防止惡意用戶生成假的時間數據,有一些中央服務器(或信任的本地服務器,用於企業部署)跟蹤時間與你相關的事件。

2
// 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; 
    } 
相關問題