Прерывания AVAudioSession

Итак, в моем приложении, работающем на iOS 6, все, кажется, отлично работает с аудио. Я использую старый формат API C, чтобы перехватывать прерывания с помощью обратного вызова; настройка через: AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, (__bridge void *)self), и это было здорово. Однако, используя SDK iOS 7, кажется, что мой обратный вызов прерывания никогда не вызывается, когда устройство принимает вызовы или отключается сигнализация.

После некоторого оглядки, я слышал, что старые C api устарели и что вы должны перейти к новым функциям AVAudioSession. Больше чтения показало, что делегат AVAudioSession устарел и что вы должны использовать NSNotification для AVAudioSessionInterruptionNotification, чтобы перехватывать прерывания и делать все, что нужно сделать.

Для меня кажется, что это уведомление никогда не срабатывает, и поэтому я никогда не получаю должным образом прерывание, которое затем прерывает все мои аудиоматериалы после завершения вызова.

Я зарегистрирую уведомление так:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(AudioInterruption:) name:AVAudioSessionInterruptionNotification object:nil];

Теперь функция AudioInterruption: просто записывает, что она была запущена. Ни журнал, ни точки останова не запускаются.

Чтобы быть понятным, изначально воспроизведение и запись звука прекрасны. Когда происходит прерывание (например, входящий вызов или сигнал тревоги), уведомление об отключении не запускается. Если вам нужен более окружающий код, сообщите мне.

Ответы

Ответ 1

У вас есть экземпляр AVCaptureSession в вашем приложении?
Если это так, я бы предложил тот же ответ, который получил по моему связанному вопросу:
Попробуйте установить NO в свойство usesApplicationAudioSession вашего экземпляра AVCaptureSession.
Это свойство доступно с iOS 7. В предыдущих версиях iOS каждый AVCaptureSession использовал частную AVAudioSession. Начиная с iOS 7, Capture Sessions используют совместное приложение AVAudioSession.
Свойство usesApplicationAudioSession включено по умолчанию, поэтому, если вы хотите сохранить прежнее поведение, вы должны отключить его, установив NO.

Я надеюсь, что это сработает и для вас.

Ответ 2

Вы не передали экземпляр AVAudioSession в свой вызов addObserver в качестве последнего параметра.

Попробуйте следующее:

AVAudioSession *session = [AVAudioSession sharedInstance];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(AudioInterruption:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:session];

Ответ 3

Для меня активизация сеанса аудио и добавление наблюдателя, когда пользователь нажимает кнопку воспроизведения, решила проблему; уведомление было уволено. Я думаю, что apple doc что-то сказал об этом здесь.