我有一个困扰了我几个月的问题。
我有一个正在运行的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/