如果应用程序在后台,iOS Swift定时器不启动
我正在开发一个Cocoapod库,在其中,我必须在计时器启动时调用一个函数。 我在iOS应用程序中使用Cocoapod,当应用程序进入后台状态时,计时器不会启动如果应用程序在后台,iOS Swift定时器不启动,ios,swift,timer,dispatch-queue,Ios,Swift,Timer,Dispatch Queue,我正在开发一个Cocoapod库,在其中,我必须在计时器启动时调用一个函数。 我在iOS应用程序中使用Cocoapod,当应用程序进入后台状态时,计时器不会启动 专用变量计时器:DispatchSourceTimer?=无 let queue = DispatchQueue(label: "sample.timer") timer = DispatchSource.makeTimerSource(queue : queue) timer?.setEventHandler { [weak
专用变量计时器:DispatchSourceTimer?=无
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计时器(可以在后台线程上运行的替代计时器),这一事实让我怀疑您是否将“后台”一词的两种完全不同的用法混为一谈:
- “后台”的一种含义与应用程序运行时的后台队列或线程有关。这与“主”线程/队列相反
而且,是的,GCD计时器与
实例不同,因为它们可以在后台队列上运行(假设应用程序本身正在实际运行)Timer
- “背景”的另一个含义与应用程序的状态有关。您可以在前台运行,也可以在后台运行,或者被挂起/终止
当应用程序运行时(前台或后台),计时器(GCD计时器或标准
)可以运行。但如果应用程序被挂起或终止,所有执行都将停止,包括计时器计时器
- 请求一点时间来完成一些有限长度的任务(在最近的iOS版本中仅运行30秒);或
- 您的应用程序已为某些批准用途启用了某些后台模式(例如导航、音乐、VOIP等)
而且,即使在iOS 13及更高版本中,如果允许更广泛的应用,它们也适用于有限长度的任务,这些任务将由操作系统自行决定启动(由电源、wifi、用户启动应用程序的频率等决定)。有关更多信息,请参阅WWDC 2019。这有点粗糙,但您可以尝试限制您在后台的时间并解决此问题
import AVFoundation
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: .mixWithOthers)
try AVAudioSession.sharedInstance().setActive(true)
}
catch { print(error) }
你的问题是什么?如何在后台启动计时器mode@QuocNguyenI知道你想让一个应用程序每五秒钟运行一次计时器,但是(a)这是个坏主意,因为它会耗尽用户的电池;(b)它违反了应用商店的指导原则。如果您告诉我们此计时器的功能用途,我们可能会建议您如何最好地实现您正在尝试的操作。苹果为各种各样的现实问题提供了各种机制。但是如果不知道为什么你的库要在后台发送数据,我们就不能给你进一步的建议。@Gokul你知道当应用程序在后台时计时器触发时如何运行代码吗?我正试图找出同样的问题。应该注意的是,这违反了应用商店的指导原则,如果苹果公司注意到你这样做,他们很可能会拒绝你的应用程序。这不会让你被商店拒绝。很明显:“多任务应用程序只能将后台服务用于其预期用途:VoIP、音频播放、位置、任务完成、本地通知等。如果您的应用程序使用位置后台模式,请包括这样做可能会显著缩短电池寿命的提醒。“如果你愿意,你可以试着偷偷溜过去,但如果他们发现后台执行的秘密使用,他们会拒绝应用。我当然不会建议为第三方开发者的CocoaPod这样做。在AVAudioSession上使用共享实例可以解决这个问题,而且不会让你被商店拒绝“永远不会让你被拒绝”。。。那根本不是真的。这样做的应用程序当然已经通过了审查程序,但苹果在这一点上毫不含糊,当然可以拒绝这样做的应用程序。现在,如果它真的是一个音乐/视频应用程序,那就不同了。但如果这仅仅是一种让应用程序保持活力的技术,他们可以因此拒绝它。此外,这只是个坏主意。它会杀死用户的电池。苹果的指导方针禁止这种做法是有原因的。你错过了一个应用程序状态。我的目的不是让他了解整个过程,而是让他明白,当用户离开应用程序时,应用程序(更不用说计时器)会自动运行。而且,坦率地说,如果他真的对定期发布更新的各种备选方案有疑问,他真的应该澄清他的问题。