После написания этого вопроса я отправил отчет об ошибке по этому вопросу.Я создал небольшой пример проекта , который, как я думал, будет повторять проблему, но я не мог ее воспроизвести!Это заставило меня еще раз углубиться и попытаться выяснить, что здесь произошло ...
Я включил сигнал тревоги iOS, затем установил точку останова в audioPlayerBeginInterruption:
и построчно проследил мой кодв отладчике.Я заметил, что до того, как мой код заработал (пока я был приостановлен в отладчике), звучал сигнал тревоги iOS 5!К счастью, оно все еще звучало, даже когда я проходил через мое приложение, поэтому я смог выяснить, какие фрагменты кода специально заставили его перестать звучать.
Часть моего прерывания: Хэндлер (очевидно) должен остановить внутреннее аудиомоего приложения, чтобы позволить прерывание пройти.Я никогда не думал проверять этот метод раньше, но оказалось, что проблема существовала там.Мой метод остановки вызвал бы prepareToPlay
сразу после остановки, чтобы в следующий раз ускорить возобновление.
[self.player stop];
[self.player prepareToPlay]; // <- iOS 5 alarm sound stopped here.
Документы указывают prepareToPlay
метод
предварительно загружает буферы и получает аудиооборудование, необходимое для воспроизведения, что минимизирует разницу между вызовом метода воспроизведения и началом вывода звука.
Звучит разумно, и это работало для небольших версий iOS.Моя гипотеза заключается в том, что , должно быть, внесли изменения в систему аварийной сигнализации Clock.app, чтобы новые звуки сигналов тревоги использовали аппаратное обеспечение, тогда как до этого использовалось программное обеспечение.Это то, что я думаю, заставляет сигналы тревоги iOS 5 в некоторых приложениях молчать.
Удаление строк prepareToPlay
вызывало срабатывание будильника без использования kAudioSessionProperty_OverrideCategoryMixWithOthers
, таким образом решая все мои проблемы, изложенные в этомвопрос.
TL; DR
Удалите вызовы prepareToPlay
из вашей логики stop
звукового кода.Это займет больше микросекунды, чтобы начать позже, но позволит звучать прерывания.