Ответ на прерывания
Добавление аудио кода сеанса для обработки прерываний гарантирует, что аудио приложения продолжает вести себя корректно, когда телефонный вызов поступает, звуки аварийного сигнала Часов или Календаря, или другое приложение активирует свой аудио сеанс.
Прерывание звука является деактивацией аудио сеанса Вашего приложения — который сразу останавливает или приостанавливает Ваше аудио, в зависимости от которой технологии Вы используете. Прерывания происходят, когда конкурирующий аудио сеанс из приложения активируется, и тот сеанс не категоризирован системой для смешивания с Вашим. После того, как Ваш сеанс идет неактивный, система отправляет, “Вы были прерваны” сообщение, на которое можно ответить путем сохранения состояния, обновления пользовательского интерфейса, и т.д.
Ваше приложение может стать приостановленным после прерывания. Когда пользователь решает принять телефонный вызов, это происходит. Если пользователь вместо этого выбирает игнорировать вызов или отклоняет предупреждение, система выпускает законченное прерыванием сообщение, и Ваше приложение продолжает работать. Для Вашего аудио для возобновления должен быть повторно активирован аудио сеанс.
Методы обработки прерывания звука
Обработайте прерывания звука путем регистрации для надлежащего NSNotification
. То, что Вы делаете в своем коде прерывания, зависит от аудио технологии, которую Вы используете и от того, что Вы используете его для — воспроизведение, запись, преобразование формата аудио, чтение переданных потоком аудио пакетов, и т.д. Вообще говоря, необходимо гарантировать минимальный возможный сбой и самое корректное восстановление, с точки зрения пользователя.
Таблица 3-1 суммирует надлежащее аудио поведение сеанса во время прерывания. Если Вы используете AVAudioPlayer
или AVAudioRecorder
объекты, некоторые из этих шагов обрабатываются автоматически системой.
После того, как прерывание запускается |
|
После того, как прерывание заканчивается |
|
Таблица 3-2 подводит итог, как обработать прерывания звука согласно технологии. Остальная часть этой главы предоставляет подробную информацию.
Аудио технология | Как работают прерывания |
---|---|
Платформа Основы AV | Если Вы хотите сохранить и восстановить позицию воспроизведения между запусками приложения, сохраните позицию воспроизведения на прерывании, а также на выходе приложения. |
Audio Queue Services, аудиоустройство I/O | Эти технологии помещают Ваше приложение в управление обработки прерываний. Вы ответственны за сохранение воспроизведения или запись позиции и за повторную активацию Вашего аудио сеанса после того, как закончится прерывание. |
OpenAL | При использовании OpenAL для воспроизведения зарегистрируйтесь для надлежащего |
System Sound Services | Когда прерывание запускается, играемое использование звуков System Sound Services идет тихое. Если прерывание заканчивается, они могут автоматически использоваться снова. Приложения не могут влиять на поведение прерывания для звуков, использующих эту технологию воспроизведения. |
Обработка прерываний от Siri
Когда Ваше приложение прервано во время воспроизведения Siri, необходимо отслеживать любые дистанционные команды, данные Siri, в то время как прерван аудио сеанс. Во время прерванного состояния отслеживайте любые команды, данные Siri, и ответьте соответственно, когда закончится прерывание. Например, во время прерывания, пользователь просит, чтобы Siri приостановил воспроизведение аудио Вашего приложения. Когда Ваше приложение уведомляется, что прерывание закончилось, это не должно автоматически продолжать играть. Вместо этого UI Вашего приложения должно указать, что это находится в приостановленном состоянии.
Жизненный цикл прерывания
Рисунок 3-1 иллюстрирует последовательность событий прежде, во время, и после аудио прерывания сеанса для приложения воспроизведения.
Событие прерывания — в этом примере, поступлении телефонного вызова — продолжается следующим образом. Пронумерованные шаги соответствуют числам в числе.
Ваше приложение активно, воспроизводя аудио.
Телефонный вызов поступает. Система активирует аудио сеанс телефонного приложения.
Система деактивировала Ваш аудио сеанс. В этой точке остановилось воспроизведение в Вашем приложении.
Система вызывает Вашу функцию обратного вызова слушателя прерывания, указывающую, что был деактивирован Ваш сеанс.
Ваш обратный вызов принимает соответствующие меры. Например, это могло обновить пользовательский интерфейс и сохранить информацию, должен был возобновить воспроизведение в точке, где это остановилось.
Если пользователь отклоняет прерывание — выбирающий игнорировать входящий телефонный вызов в этом случае — система вызывает Ваш метод обратного вызова, указывая, что закончилось прерывание.
Ваш обратный вызов принимает меры надлежащий до конца прерывания. Например, это обновляет пользовательский интерфейс, повторно активирует Ваш аудио сеанс и возобновляет воспроизведение.
(Не показанный в числе.), Если, вместо того, чтобы отклонить прерывание на шаге (6), пользователь принял телефонный вызов, Ваше приложение приостановлено. Когда телефонный вызов заканчивается, прерывание конца поставлено.
Нет никакой гарантии, что начать прерывание будет иметь прерывание конца. Ваше приложение должно знать о переключении на приоритетное состояние выполнения или пользователя, нажимающего кнопку воспроизведения. В любом случае определите, должно ли Ваше приложение повторно активировать свой аудио сеанс.
OpenAL и прерывания звука
При использовании OpenAL для воспроизведения аудио реализуйте функцию обратного вызова слушателя прерывания, как Вы делаете при использовании Audio Queue Services. Однако Ваш код прерывания должен дополнительно управлять контекстом OpenAL. После прерывания, набор контекст OpenAL к NULL
. После концов прерывания, набор контекст к его предшествующему состоянию.
Используя класс AVAudioPlayer для обработки прерываний звука
AVAudioPlayer
класс обеспечивает свои собственные методы делегата прерывания, описанные в Ссылке на протокол AVAudioPlayerDelegate. Аналогично, AVAudioRecorder
класс обеспечивает свои собственные методы делегата прерывания, описанные в Ссылке на протокол AVAudioRecorderDelegate. Вы используете аналогичные подходы для этих двух классов.
Когда Вашего запущенного с прерывания делегата вызывают, Ваш аудиоплеер уже приостанавливается, и Ваш аудио сеанс уже деактивирован. Можно обеспечить реализацию, такую как показанный в Перечислении 3-1.
Перечисление 3-1 запущенный с прерывания метод делегата для аудиоплеера
- (void) audioPlayerBeginInterruption: (AVAudioPlayer *) player { |
if (playing) { |
playing = NO; |
interruptedOnPlayback = YES; |
[self updateUserInterface]; |
} |
} |
После проверки, чтобы гарантировать, что аудиоплеер действительно играл, когда прерывание наступило, этот метод обновляет состояние Вашего приложения и затем обновляет пользовательский интерфейс. (Система автоматически приостанавливает аудиоплеер.)
Если пользователь игнорирует телефонный вызов, система автоматически повторно активирует Ваш аудио сеанс, и Ваш законченный прерыванием метод делегата вызывается. Перечисление 3-2 показывает простую реализацию этого метода.
Перечисление 3-2 законченный прерыванием метод делегата для аудиоплеера
- (void) audioPlayerEndInterruption: (AVAudioPlayer *) player { |
if (interruptedOnPlayback) { |
[player prepareToPlay]; |
[player play]; |
playing = YES; |
interruptedOnPlayback = NO; |
} |
} |
Ответ на сброс медиасервера
Медиасервер обеспечивает аудио и другую мультимедийную функциональность посредством совместно используемого серверного процесса. Несмотря на то, что редкий, в то время как Ваше приложение активно, для медиасервера возможно сбросить. Регистр для AVAudioSessionMediaServicesWereResetNotification
уведомление для контроля для сброса медиасервера. После получения уведомления Ваше приложение должно сделать следующее:
Избавьтесь от осиротевшего аудио объекта и создайте новые аудио объекты
Сбросьте любые внутренние аудио прослеживаемые состояния, включая все свойства
AVAudioSession
Когда надлежащий, повторно активируйте
AVAudioSession
использованиеsetActive:error:
метод
Можно также зарегистрироваться для AVAudioSessionMediaServicesWereLostNotification
уведомление, если Вы хотите знать, когда медиасервер сначала становится недоступным. Однако большинство приложений только должно реагировать на уведомление сброса. Только используйте потерянное уведомление, если приложение должно реагировать на пользовательские события, происходящие после того, как медиасервер потерян, но прежде чем сбрасывается медиасервер.
Обеспечение инструкций пользователю
Пользователь может не хотеть, чтобы приложение было прервано конкурирующим аудио сеансом — например, при выполнении магнитофона для получения представления.
Нет никакого программируемого способа гарантировать, что никогда не прерывается аудио сеанс. Причина состоит в том, что iOS всегда дает приоритет телефону. iOS также дает высокий приоритет определенным предупреждениям и предупреждениям — Вы не хотели бы пропускать свой рейс теперь, не так ли?
Решение гарантии непрерывной записи для пользователя для преднамеренного глушения их устройства на iOS путем взятия следующих шагов:
В приложении Настроек гарантируйте, что Авиарежим включил для устройств, имеющих Авиарежим.
В приложении Настроек гарантируйте, чтобы Не Нарушали, включен.
В Календарном приложении гарантируйте, что нет никаких предупреждений события, включенных в течение запланированного периода записи.
В приложении Часов гарантируйте, что никакие предупреждения часов не включены в течение запланированного периода записи.
Для устройств, имеющих переключатель Silent (названный Ring/Silent включают iPhone), не перемещайте переключатель во время записи. Когда Вы изменяетесь на «Тихий» режим, iPhone может вибрировать, например, в зависимости от пользовательских настроек.
Не включайте или отключайте гарнитуру во время записи. Аналогично, не прикрепляйте или расстыковывайте устройство во время записи.
Не включайте устройство в источник питания во время записи. Когда устройство на iOS включено питание, оно может подать звуковой сигнал или вибрировать, согласно устройству и к пользовательским настройкам.
Руководство пользователя является хорошим местом для передачи этих шагов пользователям.