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 говорит что-то об этом здесь.