如何 运行 后台计时器关闭应用程序在 Swift 中播放音频样本
How to run background timer with app closed playing audio samples in Swift
我正在制作一个鼓机应用程序,它需要按顺序播放短样本。我想在关闭应用程序的情况下继续播放序列。
我已按照 standard process 启用后台音频和数据处理功能,但我需要一个合适的计时器,其粒度至少为秒,将在后台触发。
我可以在关闭应用程序的情况下使用什么计时器?
下面是一些我想继续玩的示例代码:
已更新解决方案
class ViewController: UIViewController {
var player: AVAudioPlayer? = nil
var silence: AVAudioPlayer? = nil // SOLUTION
override func viewDidLoad() {
super.viewDidLoad()
let bass = Bundle.main.bundlePath + "/bd.mp3"
let backing = Bundle.main.bundlePath + "/silence.mp3" // SOLUTION
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: []) // SOLUTION
try AVAudioSession.sharedInstance().setActive(true) // SOLUTION
player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: bass))
silence = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: backing)) // SOLUTION
} catch {
print(error)
}
Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(beat), userInfo: nil, repeats: true)
silence?.numberOfLoops = -1 // Infinite // SOLUTION
silence?.play() // SOLUTION
}
@objc func beat() {
player?.play()
}
}
这里的问题似乎是当您已经在后台时试图启动 new 声音。你不能那样做。这与计时器无关。计时器运行,但对 beat
的调用失败,应用挂起。
我找到的解决方案是循环播放无声曲目,这样可以让计时器在后台 运行。然后我的应用程序需要停止静音轨道才能正常进入后台。
我正在制作一个鼓机应用程序,它需要按顺序播放短样本。我想在关闭应用程序的情况下继续播放序列。
我已按照 standard process 启用后台音频和数据处理功能,但我需要一个合适的计时器,其粒度至少为秒,将在后台触发。
我可以在关闭应用程序的情况下使用什么计时器?
下面是一些我想继续玩的示例代码:
已更新解决方案
class ViewController: UIViewController {
var player: AVAudioPlayer? = nil
var silence: AVAudioPlayer? = nil // SOLUTION
override func viewDidLoad() {
super.viewDidLoad()
let bass = Bundle.main.bundlePath + "/bd.mp3"
let backing = Bundle.main.bundlePath + "/silence.mp3" // SOLUTION
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: []) // SOLUTION
try AVAudioSession.sharedInstance().setActive(true) // SOLUTION
player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: bass))
silence = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: backing)) // SOLUTION
} catch {
print(error)
}
Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(beat), userInfo: nil, repeats: true)
silence?.numberOfLoops = -1 // Infinite // SOLUTION
silence?.play() // SOLUTION
}
@objc func beat() {
player?.play()
}
}
这里的问题似乎是当您已经在后台时试图启动 new 声音。你不能那样做。这与计时器无关。计时器运行,但对 beat
的调用失败,应用挂起。
我找到的解决方案是循环播放无声曲目,这样可以让计时器在后台 运行。然后我的应用程序需要停止静音轨道才能正常进入后台。