在后台运行计时器



我正在用 Swift 编写一个应用程序,其中计时器倒计时,很像倒计时时钟。为此,我在我的主逻辑类中使用以下代码:

func start() {
self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
self.run()
}
}

现在每次我关闭应用程序时,计时器都会停止,并收到此错误:

后台任务:不存在标识符为 1 (0x1( 的后台任务,或者它可能已结束。

有没有办法继续在后台运行的计时器?或者你有任何其他可能更优雅的方法来解决我的问题吗?我已经在堆栈溢出中搜索了几个小时,但我似乎找不到答案。

Apple 将不允许您在应用后台运行后长时间运行进程。从文档中:

实现长时间运行的任务

对于需要更多执行时间才能实现的任务,您必须请求特定权限才能在后台运行它们而不会挂起它们。在 iOS 中,只允许特定的应用类型在后台运行:

  • 后台向用户播放有声内容的应用,例如音乐播放器应用
  • 在后台录制音频内容的应用
  • 让用户随时了解其位置的应用,例如导航应用
  • 支持互联网协议语音 (VoIP( 的应用
  • 需要定期下载和处理新内容的应用
  • 从外部配件接收定期更新的应用
  • 实现这些服务
  • 的应用必须声明它们支持的服务,并使用系统框架来实现这些服务的相关方面。

声明服务可以让系统知道您使用了哪些服务,但在某些情况下,实际上是系统框架阻止了应用程序挂起。

话虽如此,如果您真的只是想更新"倒计时时钟",我只需在应用程序后台运行时存储当前系统时间(可能在 UserDefaults 中(。然后,当应用返回到前台时,将存储的时间与当前时间进行比较,并执行必要的计算以确定时钟应显示的时间。

最新更新