Ios 应用程序转到后台后,AVAudioPlayer停止返回正确的currentTime
我有一个困扰我几个月的问题 我有一个正在运行的Ios 应用程序转到后台后,AVAudioPlayer停止返回正确的currentTime,ios,swift,avfoundation,avaudioplayer,Ios,Swift,Avfoundation,Avaudioplayer,我有一个困扰我几个月的问题 我有一个正在运行的计时器,它可以打印AVAudioPlayer的currentTime,除非我 暂停播放 最小化应用程序或锁定屏幕 恢复播放 打印的时间突然变得恒定。声音正常播放,但当前时间不会再改变,除非我暂停播放器并再次调用play() 此外,最糟糕的是,它不是每次都发生,有时我不得不重复这些步骤2/3次,但错误最终还是发生了 我已经阅读了文档并搜索了一些答案,但什么都没有 private func setTimer(_ on: Bool) { guard
计时器
,它可以打印AVAudioPlayer的
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.isplay
返回false
当时间保持不变时,当时间正确增加时,它正确返回true
为什么
AVAudioPlayer
会这样对我?很明显,计时器在后台工作,播放机在这里造成问题。解决方案是停用并激活“AVAudioSession”。
当应用程序进入后台并停止播放时,iOS正在将AVAudioSession的活动状态设置为false,因此如果您使用锁定屏幕控件重新启动播放,则需要将其设置为true。
我所做的(按照上面评论中Adam的建议)是在我停止播放时将状态设置为false,然后在用户从锁定屏幕控件或通过耳塞上的播放按钮开始播放时将状态设置为true
do
{
try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
}
catch
{
NSLog(error.localizedDescription)
}
我已经在自己的应用程序中对此进行了测试,经过几周的尝试,功能现在是正确的。我也有同样的问题。我已经做了几个星期了。看起来player.currentTime在后台没有增加。如果我找到了解决方案,我会发布一个答案。我解决这个问题已经有一段时间了,如果我没记错的话,这与没有正确处理背景音频中断有关。我相信,当我适当地暂停并恢复一个音频会话时,播放器开始按预期工作。在这里检查我的答案:到目前为止还不错。我想说“解决”,直到我完全测试。我在睡眠计时器结束时添加了代码,请执行{try AVAudioSession.sharedInstance().setActive(false,选项:.notifyOthersOnDeactivation)}捕获{NSLog(error.localizedDescription)}与此相同,但在锁屏播放控制重新启动播放且似乎正常工作的情况下也是如此。经过这么长时间的坚持,在我确信之前还有很多测试。