在app中运行计时器,以及应用程序在后台运行

时间:2016-10-05 12:04:23

标签: ios swift timer

我需要在用户处于应用程序时以及应用程序处于后台时运行计时器。

上下文是:如果他在特定的视图控制器上,5分钟后将被重定向到主视图控制器。如果应用程序停留在后台并进入应用程序,计时器应重定向他。任何想法我怎么能实现这个目标?

2 个答案:

答案 0 :(得分:1)

由于不支持后台处理,因此无法使用普通NSTimer执行此操作。然而,使用另一种方法很容易实现。

在AppDelegate中,您有两种方法。 applicationWillResignActiveapplicationDidBecomeActive。在resign方法中,您只需将当前NSDate保留在NSUserDefaults和活动方法中,检索它并将其与当前NSDate进行比较,以获得应用的时间量没用了。

代码示例:

func applicationWillResignActive(application: UIApplication) {
    let date = NSDate()
    NSUserDefaults.standardUserDefaults().setObject(date, forKey: "DateTimer")
}

func applicationDidBecomeActive(application: UIApplication) {
    if let persistedDate = NSUserDefaults.standardUserDefaults().objectForKey("DateTimer") as? NSDate {
        let difference = NSCalendar.currentCalendar().components([.Second], fromDate: persistedDate, toDate: NSDate(), options: [])
        let differenceSeconds = difference.second
    }
}

答案 1 :(得分:1)

在Swift 3中执行此操作的另一种方法:

  1. 首先以秒为单位获取当前时间并将其保存为用户默认值

    func applicationWillResignActive(_ application: UIApplication) {
        let date = NSDate()
        let resignTime = Int64(date.timeIntervalSince1970)
        UserDefaults.standard.set(resignTime, forKey: "logOutTime")
    }
    
  2. 当应用变为活动状态时,您可以将上次活动时间(保存为用户默认值)与当前时间进行比较。 (注意:两个元素都必须采用一种格式)

    func applicationDidBecomeActive(_ application: UIApplication) {
        if let resignTime = UserDefaults.standard.object(forKey: "logOutTime") as? Int64 {
            let date = NSDate()
            let currentTime = Int64(date.timeIntervalSince1970)
            debugPrint("diff: ", currentTime-resignTime)
            let diff = currentTime-resignTime
            if diff >= 300{ //checking difference of time which you expect
            }
        }
    }
    
  3. 这就是全部。如果条件成立,你可以做任何你想做的事。