我有一个困扰了我几个月的问题。

我有一个正在运行的Timer,它会打印AVAudioPlayer's currentTime,除非我

暂停播放器

最小化应用程序或锁定屏幕

恢复播放

打印时间突然恒定。声音正常播放,但是currentTime不再改变,除非我暂停播放器并再次调用play()

另外,最糟糕的是它不会每次都发生,有时我不得不重复执行这些步骤2/3次,但该错误最终还是会发生。

我已经阅读了文档并搜索了一些答案,但没有任何帮助。

private func setTimer(_ on: Bool) {
    guard on else {
        timer?.invalidate()
        timer = nil
        return
    }
    guard timer == nil else { return }

    timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { _ in
        self.currentPlaybackTime = self.player.currentTime
        print("Delegate newTime: \(self.player.currentTime)")

    })
}

func play() {
    print("Tries playing")
    guard player.prepareToPlay(),
            player.play() else {
        playbackState = .failed
        return
    }
    print("Playing OK")
    setTimer(true)
    playbackState = .playing
}

控制台打印

代表新时间:68.74916099773243代表新时间:
68.74916099773243代理新时间:68.74916099773243代理新时间:68.74916099773243代理新时间:68.74916099773243
委托新时间:68.74916099773243 ...

编辑:当时间保持相同时,player.isPlaying返回false,当时间正确增加时,它正确返回true
为什么AVAudioPlayer对我这样做?很明显,计时器在后台运行,并且播放器会在此处引起问题。

最佳答案

解决方案是停用和激活“AVAudioSession”。
当应用程序进入后台并且停止播放时,iOS会将AVAudioSession的 Activity 状态设置为false,因此如果您使用锁定屏幕控件重新开始播放,则需要将其设置为true。
我所做的事情(按照亚当的建议,在上面的评论中)是在我停止播放时设置为假状态,然后在用户从锁屏控件或通过耳塞上的播放按钮开始播放时设置为true。

       do
        {
            try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
        }
        catch
        {
           NSLog(error.localizedDescription)
        }
我已经在自己的应用中对此进行了测试,经过数周的尝试,现在该功能是正确的。

关于ios - 应用程序进入后台后,AVAudioPlayer停止返回正确的currentTime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57724858/

10-11 04:35