我需要在用户处于应用程序时以及应用程序处于后台时运行计时器。
上下文是:如果他在特定的视图控制器上,5分钟后将被重定向到主视图控制器。如果应用程序停留在后台并进入应用程序,计时器应重定向他。知道我怎么能实现这个目标?
你不能用普通的NSTimer
做到这一点,因为不支持背景。然而,使用另一种方法可以非常容易地实现。
在AppDelegate中,您有两种方法。 applicationWillResignActive
和applicationDidBecomeActive
。在resign方法中,您只需要将当前的NSDate
保存到NSUserDefaults
并在active方法中,检索它并将其与当前的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
}
}
在Swift 3中执行此操作的另一种方法:
func applicationWillResignActive(_ application: UIApplication) {
let date = NSDate()
let resignTime = Int64(date.timeIntervalSince1970)
UserDefaults.standard.set(resignTime, forKey: "logOutTime")
}
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
}
}
}
就这样。如果条件成立,你可以随心所欲。