Аудио сессия duckOthers прервана удаленным push-уведомлением
У меня есть приложение для тренировки, которое воспроизводит короткие клипы каждые пару секунд. У меня включена фоновая музыка, так что музыку из других приложений можно воспроизводить во время тренировки. Проблема возникает, когда я получаю удаленное push-уведомление (в моем случае, Slack) со звуком, который каким-то образом отменяет мой аудиосеанс duckingOther, и музыка из других приложений снова становится громкой.
Вопрос - Как мне сбросить аудиосессию duckingOthers, когда пользователь получает прерывания такого типа?
Я установил аудио сессию, вызвав приведенную ниже функцию в didFinishLaunchingWithOptions:
private func setupAudioSession(){
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers, .duckOthers, .interruptSpokenAudioAndMixWithOthers])
print("AVAudioSession Category Playback OK")
do {
try AVAudioSession.sharedInstance().setActive(true)
print("AVAudioSession is Active")
} catch let error as NSError {
print(error.localizedDescription)
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
Я пытался рассматривать это как жесткое прерывание (например, телефонный звонок), но при попытке применить методы, используемые для этого типа прерывания, кажется, что удаленные push-уведомления проходят через трещины. Ниже приводится то, что я использовал из другого вопроса, чтобы попытаться поймать прерывания.
@objc func handleInterruption(notification: Notification) {
guard let userInfo = notification.userInfo,
let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt,
let type = AVAudioSessionInterruptionType(rawValue: typeValue) else {
return
}
if type == .began {
// Interruption began, take appropriate actions
print("interruption started")
}
else if type == .ended {
if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt {
let options = AVAudioSessionInterruptionOptions(rawValue: optionsValue)
if options.contains(.shouldResume) {
// Interruption Ended - playback should resume
print("should resume playback")
setupAudioSession()
} else {
// Interruption Ended - playback should NOT resume
print("should not resume playback")
}
}
}
}
func setupNotifications() {
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self,
selector: #selector(handleInterruption),
name: .AVAudioSessionInterruption,
object: nil)
}