Аудио сессия 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)
    }

0 ответов

Другие вопросы по тегам