Ios 在后台播放预定的音频
我在应用程序的后台播放音频时遇到了很大的困难。该应用程序是一个计时器,它可以倒计时并播放铃声,所有的事情最初都是使用计时器工作的。因为你不能在后台运行超过3分钟的计时器,我需要用另一种方式来播放铃声 用户可以选择铃声并设置这些铃声的播放时间(例如,立即播放铃声,5分钟后,每10分钟重复一次铃声,等等) 到目前为止,我已经尝试使用DispatchQueue.main使用通知,如果用户不暂停计时器,这将很好地工作。如果他们重新进入应用程序并暂停,我似乎无法取消此队列或暂停它 接下来,我尝试使用AVAudioEngine,并创建了一组节点。这些将在应用程序处于前台时播放,但似乎会在后台停止。此外,当我暂停引擎并稍后恢复时,它不会正确暂停序列。它会把铃铛一个接一个地压碎,或者根本不响 如果有人对如何解决我的问题有任何想法,那就太好了。从技术上讲,我可以尝试从引擎中删除所有内容,并在用户暂停/恢复时从暂停的时间重新创建它,但这似乎成本很高。它也不能解决音频在后台停止的问题。我有所需的背景模式“应用程序使用Airplay播放音频或流式音频/视频”,并且在功能中的背景模式下也会进行检查 下面是我如何尝试设置音频引擎的示例。registerAndPlaySound方法会被多次调用以创建节点链(或者这样做是否错误?)。目前代码有点混乱,因为我已经尝试了很多方法来实现它Ios 在后台播放预定的音频,ios,iphone,swift,audio,background,Ios,Iphone,Swift,Audio,Background,我在应用程序的后台播放音频时遇到了很大的困难。该应用程序是一个计时器,它可以倒计时并播放铃声,所有的事情最初都是使用计时器工作的。因为你不能在后台运行超过3分钟的计时器,我需要用另一种方式来播放铃声 用户可以选择铃声并设置这些铃声的播放时间(例如,立即播放铃声,5分钟后,每10分钟重复一次铃声,等等) 到目前为止,我已经尝试使用DispatchQueue.main使用通知,如果用户不暂停计时器,这将很好地工作。如果他们重新进入应用程序并暂停,我似乎无法取消此队列或暂停它 接下来,我尝试使用AVA
func setupSounds{
if (attached){
engine.detach(player)
}
engine.attach(player)
attached = true
let mixer = engine.mainMixerNode
engine.connect(player, to: mixer, format: mixer.outputFormat(forBus: 0))
var bell = ""
do {
try engine.start()
} catch {
return
}
if (currentSession.bellObject?.startBell != nil){
bell = (currentSession.bellObject?.startBell)!
guard let url = Bundle.main.url(forResource: bell, withExtension: "mp3") else {
return
}
registerAndPlaySound(url: url, delay: warmUpTime)
}
}
func registerAndPlaySound(url: URL, delay: Double) {
do {
let file = try AVAudioFile(forReading: url)
let format = file.processingFormat
let capacity = file.length
let buffer = AVAudioPCMBuffer(pcmFormat: format, frameCapacity: AVAudioFrameCount(capacity))
do {
try file.read(into: buffer)
}catch {
return
}
let sampleRate = buffer.format.sampleRate
let sampleTime = sampleRate*delay
let futureTime = AVAudioTime(sampleTime: AVAudioFramePosition(sampleTime), atRate: sampleRate)
player.scheduleBuffer(buffer, at: futureTime, options: AVAudioPlayerNodeBufferOptions(rawValue: 0), completionHandler: nil)
player.play()
} catch {
return
}
}
嗨,你有解决办法吗?嗨,你有解决办法吗?