Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.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 在后台播放预定的音频_Ios_Iphone_Swift_Audio_Background - Fatal编程技术网

Ios 在后台播放预定的音频

Ios 在后台播放预定的音频,ios,iphone,swift,audio,background,Ios,Iphone,Swift,Audio,Background,我在应用程序的后台播放音频时遇到了很大的困难。该应用程序是一个计时器,它可以倒计时并播放铃声,所有的事情最初都是使用计时器工作的。因为你不能在后台运行超过3分钟的计时器,我需要用另一种方式来播放铃声 用户可以选择铃声并设置这些铃声的播放时间(例如,立即播放铃声,5分钟后,每10分钟重复一次铃声,等等) 到目前为止,我已经尝试使用DispatchQueue.main使用通知,如果用户不暂停计时器,这将很好地工作。如果他们重新进入应用程序并暂停,我似乎无法取消此队列或暂停它 接下来,我尝试使用AVA

我在应用程序的后台播放音频时遇到了很大的困难。该应用程序是一个计时器,它可以倒计时并播放铃声,所有的事情最初都是使用计时器工作的。因为你不能在后台运行超过3分钟的计时器,我需要用另一种方式来播放铃声

用户可以选择铃声并设置这些铃声的播放时间(例如,立即播放铃声,5分钟后,每10分钟重复一次铃声,等等)

到目前为止,我已经尝试使用DispatchQueue.main使用通知,如果用户不暂停计时器,这将很好地工作。如果他们重新进入应用程序并暂停,我似乎无法取消此队列或暂停它

接下来,我尝试使用AVAudioEngine,并创建了一组节点。这些将在应用程序处于前台时播放,但似乎会在后台停止。此外,当我暂停引擎并稍后恢复时,它不会正确暂停序列。它会把铃铛一个接一个地压碎,或者根本不响

如果有人对如何解决我的问题有任何想法,那就太好了。从技术上讲,我可以尝试从引擎中删除所有内容,并在用户暂停/恢复时从暂停的时间重新创建它,但这似乎成本很高。它也不能解决音频在后台停止的问题。我有所需的背景模式“应用程序使用Airplay播放音频或流式音频/视频”,并且在功能中的背景模式下也会进行检查

下面是我如何尝试设置音频引擎的示例。registerAndPlaySound方法会被多次调用以创建节点链(或者这样做是否错误?)。目前代码有点混乱,因为我已经尝试了很多方法来实现它

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

嗨,你有解决办法吗?嗨,你有解决办法吗?