从后台唤醒时AVPlayer audioSessionGotInterrupted通知

我用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.

最佳答案 检查一下

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

从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
  }
}
点赞