Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 应用程序转到后台后,AVAudioPlayer停止返回正确的currentTime_Ios_Swift_Avfoundation_Avaudioplayer - Fatal编程技术网

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)}与此相同,但在锁屏播放控制重新启动播放且似乎正常工作的情况下也是如此。经过这么长时间的坚持,在我确信之前还有很多测试。