如果应用在后台,iOS迅速计时器不触发



我正在开发一个Cocoapod库,在该库中,我必须在计时器启动时调用功能。我在iOS应用中使用该可可录,计时器在应用程序转到后台状态

时不会触发

private var timer : DispatchSourceTimer? = nil

let queue = DispatchQueue(label: "sample.timer")
timer = DispatchSource.makeTimerSource(queue : queue)
timer?.setEventHandler 
{
    [weak self] in
    self?.sendData()
}
timer?.scheduleRepeating(deadline: .now(), interval: .seconds(5))

您正在使用GCD计时器的事实(可以在背景线程上运行的Timer的替代方案(使我想知道您是否正在将"背景"一词的两个完全不同的用法混为一谈:

  • "背景"的一个含义与应用程序运行时的背景队列或线程有关。这与"主"线程/队列相反。

    ,是的,GCD计时器与Timer实例不同,因为它们可以在后台队列上运行(假设应用程序本身实际上正在运行(。

  • "背景"的另一个含义与应用程序的状态有关。您可以在前景中运行,在后台运行,也可以被暂停/终止。

    当应用程序正在运行(在前景或背景中(时,计时器(GCD计时器或标准Timer(可以运行。但是,如果应用程序被暂停或终止,所有执行将停止,包括计时器。

问题在于,当应用程序本身已被暂停时,您正在尝试运行计时器。那是行不通的。

除非您要么:

,您的应用程序将不会在后台运行
  • 请求一些时间来完成一些有限的长度任务(在最近的iOS版本中仅运行30秒(;或

  • 您的应用程序为某些批准的目的启用了一些背景模式(例如导航,音乐,VoIP等(。

但是,除了那些特殊的狭窄情况(例如VoIP,音乐,导航应用程序等(外,应用程序无法继续在后台运行(计时器或其他任何内容(。有关背景执行的更多信息,请参见:

  • 管理应用程序的生命周期
  • 关于背景执行序列

,即使在允许更概括的背景任务的iOS 13及以后,它们旨在用于有限的长度任务,该任务将由OS自行决定(由Power,wifi,Wifi,频率确定(用户启动应用程序等(。有关更多信息,请参见App Background Execution中的WWDC 2019 Advings。

这有点骇客,但是您可以尝试限制在后台和解决此问题的时间。

import AVFoundation
do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: .mixWithOthers)
    try AVAudioSession.sharedInstance().setActive(true)
}
catch { print(error) }

最新更新