gpt4 book ai didi

ios - 从后台唤醒时 AVPlayer audioSessionGotInterrupted 通知

转载 作者:可可西里 更新时间:2023-11-01 04:45:10 24 4
gpt4 key购买 nike

我使用 AVAudioPlayer 来播放音频。我启用了背景音频并且 Audio Session 配置正确。

我实现了 audioSessionGotInterrupted 方法,以便在 Audio Session 中断时收到通知。这是我当前的代码:

@objc private func audioSessionGotInterrupted(note: NSNotification) {

guard let userInfo = note.userInfo,
let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
let type = AVAudioSessionInterruptionType(rawValue: typeValue) else {
return
}

if type == .began {
print("interrupted")
// Interruption began, take appropriate actions
player.pause()
saveCurrentPlayerPosition()
}
else if type == .ended {
if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt {
let options = AVAudioSessionInterruptionOptions(rawValue: optionsValue)
if options == .shouldResume {
print("restored")
// Interruption Ended - playback should resume
setupPlayer()
player.play()
} else {
// Interruption Ended - playback should NOT resume
// just keep the player paused
}
}
}
}

现在我执行以下操作:

  • 播放一些音频
  • 锁定手机
  • 暂停音频
  • 等待几秒钟,直到我在 XCode 调试器中看到该应用已在后台停止
  • 我在锁屏中点击播放

我的 commandCenter play() 方法按预期被调用。然而,audioSessionGotInterrupted 方法也会通过 type == .began 调用。

这怎么可能?我希望看不到那种通知,或者至少看不到 .ended

我使用的是 iOS 10 beta 8。

最佳答案

检查这个

https://developer.apple.com/documentation/avfoundation/avaudiosession/1616596-interruptionnotification

从 iOS 10 开始,系统将停用大多数应用程序的 Audio Session 以响应应用进程被挂起。当应用程序再次开始运行时,它会收到一个中断通知,表明其 Audio Session 已被系统停用。此通知在时间上必然会延迟,因为它只能在应用程序再次运行后才能传递。如果您的应用程序的 Audio Session 因此暂停,则 userInfo 字典将包含值为 true 的 AVAudioSessionInterruptionWasSuspendedKey 键。

如果您的 Audio Session 配置为不可混合(播放、playAndRecord、soloAmbient 和 multiRoute 类别的默认行为),建议您在离开时不主动使用音频的情况下停用 Audio Session 进入背景。这样做可以避免您的 Audio Session 被系统停用(并避免收到这个有点令人困惑的通知)。

if let reason = AVAudioSessionInterruptionType(rawValue: reasonType as! UInt) {
switch reason {
case .began:
var shouldPause = true
if #available(iOS 10.3, *) {
if let _ = notification.userInfo?[AVAudioSessionInterruptionWasSuspendedKey] {
shouldPause = false
}
}
if shouldPause {
self.pause()
}
break
case .ended:
break
}
}

关于ios - 从后台唤醒时 AVPlayer audioSessionGotInterrupted 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39184859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com