AVAudioSession Прерывания

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

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

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

Я подписываюсь на уведомление так:

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

На данный момент, AudioInterruption: функция просто регистрирует, что ее уволили. Ни журнал, ни какие-либо точки останова не срабатывают.

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

3 ответа

Решение

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

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

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

Попробуй это:

AVAudioSession *session = [AVAudioSession sharedInstance];

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

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

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