如果应用程序在后台,则不会触发iOS Swift Timer

时间:2018-03-28 05:39:04

标签: ios swift timer dispatch-queue

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

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))

2 个答案:

答案 0 :(得分:0)

您正在使用GCD计时器(可以在后台线程上运行的Timer的替代方案)这一事实让我想知道您是否正在混淆“背景”一词的两种完全不同的用法:

  • “背景”的一个含义与应用程序运行时的后台队列或线程有关。这与“主”线程/队列形成对比。

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

  • “背景”的其他含义与应用程序的状态有关。您可以在前台运行,在后台运行,也可以暂停/终止。

    当应用程序正在运行时(在前台或后台),计时器(GCD计时器或标准Timer)可以运行。但是,如果某个应用程序被暂停或终止,则所有执行都将停止,包括计时器。

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

您的应用不会在后台运行,除非您:

  • 请求一点时间完成一些有限长度的任务(IIRC,只运行3分钟);或

  • 您的应用已针对某些已批准的目的启用了某种后台模式(例如导航,音乐,VOIP等)。

但是应用程序不能继续在后台运行(计时器或其他任何东西),除了那些特殊的,狭窄的情况。有关后台执行的更多信息,请参阅iOS App Programming Guide: Background Execution

答案 1 :(得分:-1)

这有点hacky,但你可以尝试在后台限制你的时间并解决这个问题。

import AVFoundation

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