Прерывания AVAudioSession

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

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

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

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

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

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

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


person Doc    schedule 07.11.2013    source источник
comment
Кстати, если я вручную опубликую AVAudioSessionInterruptionNotification, то мой наблюдатель сработает, так что это сработает. До сих пор не понимаю, почему система не публикует само уведомление.   -  person Doc    schedule 11.11.2013
comment
Вы установили режим AVAudioSession и вызвали setActive?   -  person imihaly    schedule 12.11.2013
comment
Да, иначе звук не воспроизводился бы изначально, что он и делает. [session setMode:AVAudioSessionModeVoiceChat error:&error] и [[AVAudioSession sharedInstance] setActive:YES error:&activationError]. Я устанавливаю режим перед добавлением наблюдателя и устанавливаю актив после этого, хотя это не должно иметь значения (?).   -  person Doc    schedule 12.11.2013
comment
Что вы установили для своих аудио категорий?   -  person H.Rabiee    schedule 18.11.2013
comment
Я использую AVAudioSessionCategoryPlayAndRecord. Эксперименты с вариантами не дали никаких изменений независимо от выбора.   -  person Doc    schedule 18.11.2013


Ответы (3)


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

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

person Axel83    schedule 17.01.2014
comment
Я попробую это в понедельник (или, если у меня будет возможность на выходных, я побегу в офис, чтобы попробовать это раньше). Скрещиваю пальцы~ - person Doc; 18.01.2014
comment
Это исправило мою проблему! Большое спасибо за помощь (и не забудьте бросить ответ сюда после того, как получите свой собственный)! - person Doc; 21.01.2014
comment
что, если у меня нет AVCaptureSession? Будет ли это работать, если я создам фиктивный объект AVCaptureSession (без добавления входов/выходов)? - person Marek R; 14.06.2014

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

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

AVAudioSession *session = [AVAudioSession sharedInstance];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(AudioInterruption:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:session];
person Tes    schedule 21.12.2013
comment
Прохождение сеанса не обязательно, оно просто не позволяет наблюдателю получать уведомления от других объектов. На всякий случай я отредактировал свой код, чтобы передать сеанс вместо nil, не помогло. Спасибо за предложение. - person Doc; 27.12.2013

Для меня активация аудиосессии и добавление наблюдателя, когда пользователь фактически нажимает кнопку воспроизведения, решили проблему; уведомление сработало. Я думаю, что Apple doc говорит что-то об этом -CH11-SW1" rel="nofollow noreferrer">здесь.

person adrian.ana    schedule 30.11.2016