在后台运行计时器

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

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

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

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

是否可以继续在后台运行计时器?还是您有其他可能更优雅的方式来解决我的问题?我已经在整个stackoverflow上搜索了几个小时,但是似乎找不到答案。

xuquanfu 回答:在后台运行计时器

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

执行长期运行的任务

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

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

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

话虽如此,如果您真的只是在尝试更新“倒数时钟”,那么我将在应用程序后台运行时简单地存储当前系统时间(也许在UserDefaults中)。然后,当应用程序回到前台时,将存储的时间与当前时间进行比较,并执行必要的计算以确定您的时钟应显示什么时间。

本文链接:https://www.f2er.com/2771256.html

大家都在问