Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.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 Swift定时器不启动_Ios_Swift_Timer_Dispatch Queue - Fatal编程技术网

如果应用程序在后台,iOS Swift定时器不启动

如果应用程序在后台,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

我正在开发一个Cocoapod库,在其中,我必须在计时器启动时调用一个函数。 我在iOS应用程序中使用Cocoapod,当应用程序进入后台状态时,计时器不会启动

专用变量计时器: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等)

但应用程序不能继续在后台运行(计时器或其他任何东西),除非是那些特殊、狭窄的情况(如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上使用共享实例可以解决这个问题,而且不会让你被商店拒绝“永远不会让你被拒绝”。。。那根本不是真的。这样做的应用程序当然已经通过了审查程序,但苹果在这一点上毫不含糊,当然可以拒绝这样做的应用程序。现在,如果它真的是一个音乐/视频应用程序,那就不同了。但如果这仅仅是一种让应用程序保持活力的技术,他们可以因此拒绝它。此外,这只是个坏主意。它会杀死用户的电池。苹果的指导方针禁止这种做法是有原因的。你错过了一个应用程序状态。我的目的不是让他了解整个过程,而是让他明白,当用户离开应用程序时,应用程序(更不用说计时器)会自动运行。而且,坦率地说,如果他真的对定期发布更新的各种备选方案有疑问,他真的应该澄清他的问题。