如何在iOS上设置长时间运行的计时器

eh57zj3b  于 2022-11-26  发布在  iOS
关注(0)|答案(1)|浏览(170)

我想创建一个计时器,每小时启动一次。但是根据我的研究,一个应用程序在后台运行10分钟后就会暂停。而且似乎这个应用程序在屏幕锁定后也会暂停。
我想每1小时触发一次这个计时器。当应用程序进入后台时,我将使计时器无效,当应用程序进入前台时,我将重新启动计时器。因此,我有几个问题:
1.当用户在后台运行应用程序并返回时,如果计时器已超过1小时,是否会立即触发?
1.如果用户在多(2+)小时后返回应用程序,计时器是否会触发多次?
是否有任何建议的方法来设置这样的长时间运行的计时器,使他们更一致地发射,而不是只有一次,当他们设置?

pbossiut

pbossiut1#

你可以不使用后台计时器来做这样的事情。这只是你如何达到你的要求的想法,根据你的要求添加一个或多个小时的条件。

var totalTime = Double()

override func viewDidLoad() {
  super.viewDidLoad()

// MARK: - To Reset timer's sec if app is in background and foreground
    NotificationCenter.default.addObserver(self, selector: #selector(self.background(_:)), name: UIApplication.didEnterBackgroundNotification, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(self.foreground(_:)), name: UIApplication.willEnterForegroundNotification, object: nil)
}

 @objc func background(_ notification: Notification) {
   if self.totalTime > 0{
     user_default.setValue(self.totalTime, forKey: "TotalSecInBackground")
     user_default.setValue(Date().timeIntervalSince1970, forKey: "OldTimeStamp")
     LogInfo("total seconds left in background: \(self.totalTime)")
  }
}

  @objc func foreground(_ notification: Notification) {
   let timerValue: TimeInterval = user_default.value(forKey: "TotalSecInBackground") as? TimeInterval ?? 0
   let otpTimeStamp = user_default.value(forKey: "OldTimeStamp") as? TimeInterval ?? 0
   let timeDiff = Date().timeIntervalSince1970 - otpTimeStamp
    if timerValue > timeDiff{
    LogInfo("total second & timeDiff:, \(Int(timerValue)),\(Int(timeDiff))")
    let timeLeft = timerValue - timeDiff
    self.totalTime = Int(timeLeft)
    LogInfo("timeLeft: \(Int(timeLeft))") // <- This is what you need
}}

相关问题