Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在后台运行计时器_Ios_Swift_Timer_Nstimer_Background Process - Fatal编程技术网

Ios 在后台运行计时器

Ios 在后台运行计时器,ios,swift,timer,nstimer,background-process,Ios,Swift,Timer,Nstimer,Background Process,我正在用Swift写一个应用程序,里面有一个计时器倒计时,很像倒计时钟。为此,我在主逻辑类中使用以下代码: func start() { self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in self.run() } } 现在,每次我关闭应用程序时,计时器都会停止,并出现以下错误: BackgroundTask:不存在标识符为1(0x1)的后台任务,或者该

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

func start() {
    self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
        self.run()
    }
}
现在,每次我关闭应用程序时,计时器都会停止,并出现以下错误:

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


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

在你的应用程序被备份后,苹果将不允许你长时间运行进程。从文档中:

执行长时间运行的任务

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

  • 在后台向用户播放音频内容的应用程序,如音乐播放器应用程序
  • 在后台录制音频内容的应用程序
  • 随时通知用户其位置的应用程序,如导航应用程序
  • 支持互联网语音协议(VoIP)的应用程序
  • 需要定期下载和处理新内容的应用程序
  • 从外部附件接收定期更新的应用程序
  • 实现这些服务的应用程序必须声明它们支持的服务,并使用系统框架实现这些服务的相关方面
声明服务可以让系统知道您使用了哪些服务,但在某些情况下,实际上是系统框架阻止了应用程序挂起


话虽如此,如果你真的只是想更新一个“倒计时时钟”,我会简单地存储应用程序后台运行时的当前系统时间(可能是用户默认值)。然后,当应用程序返回前台时,将存储的时间与当前时间进行比较,并执行必要的计算,以确定时钟应显示的时间

这回答了你的问题吗@可能是特贾南达穆里,但我必须做大量的工作才能摆脱这一困境。谢谢你的链接,很有用。你看到这个了吗?根据倒计时的方式/内容,您可以使用UserDefaults并在计时器启动时保存时间戳,在应用程序进入后台时停止计时器,然后在应用程序再次激活时检查此时间戳并重新启动计时器。