Прерывания 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 что-то сказал об этом здесь.