我用AVAudioPlayer播放音频.我启用了后台音频,并且音频会话配置正确.
我实现了audioSessionGotInterrupted方法,以便在音频会话中断时被通知.这是我目前的代码:
@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()方法按预期调用.但是,使用type == .began调用audioSessionGotInterrupted方法.
怎么可能?我希望看到没有这种通知或至少看到
我使用iOS 10 beta 8.
最佳答案 检查一下
从iOS 10开始,系统将停用大多数应用的音频会话,以响应暂停的应用进程.当应用程序再次开始运行时,它将收到一个中断通知,表明其音频会话已被系统停用.此通知必须及时延迟,因为它只能在应用再次运行后才能发送.如果您的应用程序的音频会话因此而暂停,则userInfo字典将包含值为true的AVAudioSessionInterruptionWasSuspendedKey键.
如果您的音频会话配置为不可混合(播放,playAndRecord,soloAmbient和multiRoute类别的默认行为),如果您在进入后台时没有主动使用音频,建议您停用音频会话.这样做可以避免系统停用音频会话(并收到这个有点令人困惑的通知).
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
}
}