ios - iOS 12 中通知中心下拉时计时器会中断

标签 ios swift timer notifications

所以我正在创建一个具有倒计时器的应用程序。当应用程序退出时,我使用观察者来了解应用程序是否在后台。如果是,我将使计时器无效并将退出时间存储在 userDefaults 中。然后,当应用程序返回前台时,我创建一个新计时器并计算应用程序在后台运行的时间,并从总持续时间中减去它,以获得耗时。当应用程序转到后台时,我将时间存储在 UserDefaults 中:

 @objc func applicationDidEnterBackground() {
    let defaults = UserDefaults.standard
    let quitTime = Date()
    defaults.set(quitTime, forKey: "quitTimeKey") //Storing the time of quit in UserDefaults
    timer?.invalidate()

}

然后,当应用程序进入前台时,我创建一个新的计时器实例:

@objc func appEntersForeground() {
    calculateTimeLeft()
    if (timer == nil)
    {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(handleCountdown), userInfo: nil, repeats: true)
    }

}

然后我检查耗时:

func checkElapsedTime() -> Double {
    let currentTime = Date()
    let appQuitTime = UserDefaults.standard.object(forKey: "quitTimeKey") as? Date ?? Date.distantFuture
    let elapsedTime = currentTime.timeIntervalSince(appQuitTime)

    return elapsedTime
}

我还打印时差:

let timeDifference = checkElapsedTime()
print("timeDifference = \(timeDifference)")

问题:但是,这里有一个问题。当我使用该应用程序时,将通知中心向下滑动并向后滑动甚至不到一秒钟,我就会得到几千秒的 timeDifference 读数。

这可能是什么原因?这是 iOS 12 的错误吗?仅当我在应用程序中拉下通知中心时才会发生这种情况。

最佳答案

好吧,我已经成功了。基本上,当您向下滑动通知中心时,您正在调用applicationWillResignActive。因此,我没有调用 applicationDidEnterBackground,而是使用 applicationWillResignActive 来发送通知,并且一切正常!

关于ios - iOS 12 中通知中心下拉时计时器会中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51855565/

相关文章:

swift - 为什么我的特殊 Codable 协议(protocol)与 Swift 的 Codable with Array 的工作方式不同?

Java Swing 动画

ios - 如何在 iPhone/iPad 上播放系统声音?

ios - UITableView插入行装饰

swift - 如何在 NSView 子类中绘制两行文本? (macOS 系统托盘)

swift - SKPhysicsJointFixed 在移动节点时不会将节点保持在一起

php - 一些定时器系统

c# - 单击标签 C# 上的从 10 到 0 设置文本的按钮后倒计时

ios - MPMoviePlayerController播放音频时在状态栏中不显示播放图标

ios - PFQueryTableViewController 加载 5 分钟