Сбой приложения из-за изменения громкости, указывает, что сообщение KVO было получено, но не обработано для ключевого пути «outputVolume»

#swift #debugging #key-value-observing #avaudiosession

#swift #отладка #наблюдение за значением ключа #avaudiosession

Вопрос:

Мое приложение вылетает при каждом изменении громкости. Это говорит мне, что я не обрабатываю уведомление от AVAudioSession, но я настроил для этого наблюдателя и установил точку останова, чтобы убедиться, что оно действительно обрабатывается.

     var kvoVolumeObs: NSKeyValueObservation?

    func observe() {
    kvoVolumeObs = audioSession.observe(.outputVolume, options: [.new, .old], changeHandler: { (session, change) in
         print("volume for session (session.outputVolume)")
        if let player = self.player {
            player.setVolume(session.outputVolume)
        }
    })
}
  

Может быть, я не обрабатываю его в правильном месте?

Я устанавливаю AVAudioSession как активный в моем классе AVPlayer, но я бы не ожидал, что это инициирует вызов KVO.

     func startAudioSession() {
    backgroundSessionKillTimer?.invalidate()
    DispatchQueue.global().async {
        do {
            try AVAudioSession.sharedInstance().setActive(true, options: AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation)
        } catch let error as NSError {
            print("Failed to set AudioSession Stuff (error.localizedDescription)")
        }
    }
}
  

Я некоторое время работал над этим без решения. Любая помощь приветствуется.

Инструкция отладки для сбоя приведена ниже.

 2020-09-28 08:00:11.082153-0600 98.5 KYGO[1507:259676] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<CFRunLoopSource 0x1044d1840 [0x1e13d5b40]>{signalled = No, valid = Yes, order = 0, context = <SCNetworkReachability RLS> {target = 0x10bcf8f80}}: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: outputVolume
Observed object: <AVAudioSession: 0x10444d5a0>
Change: {
    kind = 1;
    new = 1;
}
Context: 0x0'
*** First throw call stack:
(0x193951114 0x1a7177cb4 0x194bc8f84 0x194bc90a4 0x194bcb4d8 0x194bc88d0 0x19adc869c 0x19adc1404 0x102b97db8 0x102b995fc 0x102ba7a6c 0x1938d0c30 0x1938cb0e8 0x1938ca200 0x1a99c5598 0x196190004 0x1961955d8 0x100fe9248 0x1935a9598)
libc  abi.dylib: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<CFRunLoopSource 0x1044d1840 [0x1e13d5b40]>{signalled = No, valid = Yes, order = 0, context = <SCNetworkReachability RLS> {target = 0x10bcf8f80}}: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: outputVolume
Observed object: <AVAudioSession: 0x10444d5a0>
Change: {
    kind = 1;
    new = 1;
}
Context: 0x0'
terminating with uncaught exception of type NSException
  

Комментарии:

1. Я думал, что эта функция предназначена только для старой версии реализации KVO?

2. Возможно, вы правы. Я основывал свой комментарий на методе, упомянутом в сообщении об ошибке.