我正在开发一个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))
答案 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) }