Как начать воспроизведение звука в беззвучном режиме и заблокирован в iOS 6? - PullRequest
46 голосов
/ 15 марта 2012

Процесс конечного пользователя

  1. Открытие приложения
  2. Включение «Тихого режима».
  3. Нажмите «Кнопка блокировки»
  4. Приложениеможет по-прежнему НАЧАТЬ воспроизведение звука по прошествии нескольких часов, не воспроизводя в это время никакого звука.

Приложения, которые делают это

Этому способно сделать множество приложений тревоги, и яне думайте, что они используют тихий звук, чтобы приложение продолжало работать, поскольку они не звучат, если вы фактически выходите из приложения с домом.

  • Будильник Pro
  • Мои часы
  • Волновой будильник
  • Будильник
  • iHome
  • ...

... Поддерживают ли они цикл после того, как были заблокированы каким-либо образом, или это уведомление (которое не может воспроизводить звук в беззвучном режиме), запускающее резервное копирование приложения для воспроизведения звука, или каким-либо другим способом?

Реализованы текущие методы

AVAudioPlayer с использованием:

AudioSessionInitialize(nil, nil, nil, nil);
AudioSessionSetActive(YES);

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),&sessionCategory);

И настройкой Info.plist:

Необходимые фоновые режимы (UIBackGroundModes) - приложение воспроизводитаудио (аудио)

В настоящее время

Я могу воспроизводить звук даже в беззвучном режиме, когда приложение запущено и на экране.Если звук уже запущен, приложение можно закрыть кнопкой «Домой», и звук запустится.НО, если приложение не воспроизводит звук, а экран заблокирован, все потоки уничтожаются, и звук никогда не воспроизводится.Как этим приложениям удается обойти это?

Возможные подходы, найденные до сих пор

A.Используйте 'beginBackgroundTaskWithExpirationHandler:' с бесконечным циклом, чтобы приложение продолжало работать бесконечно.

Плюсы:

  • Похоже, вы можете сделать эту работу вмножество ситуаций, даже когда пользователь нажимает клавишу home.

Минусы:

  • Насколько я могу судить, это противоречит политике Apple.
  • будет использовать больше ресурсов

Комментарии:

Я почти заставил это работать и, возможно, с некоторыми изменениями.Похоже, это не то, что делают все остальные тревоги, так как они не продолжают работать, если вы нажмете домашнюю BTN.Что говорит о том, что они используют какой-то метод, который дает им разрешение на запуск, пока он заблокирован, но не в BG.(Что мне и нужно)

Также, когда вы спрашиваете, сколько времени у вас осталось, вы получаете примерно 10 минут.Отбросив туда бесконечный цикл, цифры фактически опустятся до 0, а затем перейдут в минус на несколько часов подряд (протестировано). Я не уверен, как это будет вести себя в реальном мире или с точки зрения принятия приложения.

B.Используйте бесшумную звуковую петлю, чтобы выдавать себя за непрерывный аудиопроигрыватель медиа-центра

Плюсы:

  • Работает при блокировке и будет продолжать работать вбольшинство ситуаций.

Минусы:

  • Может произойти сбой при прерывании другим медиацентром и в некоторых других случаях.
  • МожетТакже обратите внимание на политику Apple.

Комментарии:

Это может работать во многих ситуациях, но далеко не идеально.И поскольку, как я еще раз говорю, должен быть другой метод, который не задокументирован.

Заключение пока что

Тестирование с перечисленными APPs показывает, что они не используют ни один из двух методов, которые я только что описал.Метод «А», кажется, ближе, но если он будет реализован, он не будет вести себя так, как ведут себя эти приложения.

Я использовал билет разработчика Apple, чтобы получить больше информации, я также опубликую любые новые открытия в отношении этих средств.

Спасибо

Любое понимание приветствуется и за ваше участие до сих пор.

Ответы [ 8 ]

15 голосов
/ 01 февраля 2013

Вам необходимо внести пару изменений в plist-файл.

т.е. 1) установить для обязательного фонового режима значение App, воспроизводящее аудио

2) установить приложение не работает в фоновом режиме на YES.

 NSError *setCategoryErr = nil;
    NSError *activationErr  = nil;
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
    [[AVAudioSession sharedInstance] setActive:YES error:&activationErr];

Затем вам нужно написать столько кода в AppDelege

Теперь вы можете легко запускать звук при блокировке экрана телефона или в фоновом режиме.

5 голосов
/ 16 марта 2012

Если бы вы ранее делали это в своем приложении:

    AudioSessionInitialize (NULL, NULL, NULL, NULL);
    AudioSessionSetActive(true);

    // Allow playback even if Ring/Silent switch is on mute
    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
                             sizeof(sessionCategory),&sessionCategory);

У меня был пользователь, который сказал мне, что звук не работает в приложении (задолго до iOS5!). Оказалось, что их кольцо / бесшумный переключатель был установлен в "тихий". Поэтому я добавил этот код, и он вызывает переопределение «тихого» параметра. Это полезно, например, если у вас есть музыкальное приложение и вы хотите, чтобы музыка продолжала играть.

2 голосов
/ 26 ноября 2012

Долгосрочное решение этого вопроса может быть обоснованием на основе местоположения. В основном используйте фоновую службу определения местоположения, чтобы оправдать периодические обновления вашего приложения и, таким образом, вызвать тревогу. Это может быть оправдано Apple, включив функцию, такую ​​как Обновления погоды, которая требует услуг определения местоположения.

Я немного загляну в будущее. Пожалуйста, если у вас есть время, чтобы посмотреть на это сейчас, или если у вас есть понимание, не стесняйтесь писать.

Удачной охоты.

1 голос
/ 26 марта 2012

Вы зарегистрировали ваше приложение как нуждающееся в использовании звука в фоновом режиме?

Из документов :

A: Я использую MPMoviePlayerController для воспроизведенияфильмы только для аудио и другие аудиофайлы на iPhone в iOS 4. Как обеспечить продолжение воспроизведения звука, когда приложение переключается в фоновый режим или экран заблокирован?

Во-первых, вы должны заявить, чтоВаше приложение поддерживает фоновое выполнение.Приложение делает это, включив ключ UIBackgroundModes в свой файл Info.plist.Этот ключ определяет, какие фоновые задачи поддерживает ваше приложение.Его значение представляет собой массив, который содержит одну или несколько строк.Укажите строковое значение audio, чтобы указать, что приложение воспроизводит звуковой контент для пользователя в фоновом режиме.

Далее. Если вы хотите, чтобы звук вашего фильма продолжался при блокировке экрана, необходимо назначить соответствующую категорию.на ваш аудио сеанс.Вы не можете полагаться на аудиосеанс по умолчанию, чья категория (начиная с iPhone OS 2.2) - это AVAudioSessionCategorySoloAmbient (или эквивалентно kAudioSessionCategory_SoloAmbientSound).

Для продолжения воспроизведения, когда экран блокируется или когда переключатель Ring / Silent установленв «тихой» позиции используйте категорию AVAudioSessionCategoryPlayback (или эквивалентную категорию kAudioSessionCategory_MediaPlayback).В листинге 1 показано, как инициализировать аудиосеанс приложения с категорией AVAudioSessionCategoryPlayback.

1 голос
/ 17 марта 2012

Просто проверьте, нет ли в вашем коде этой строки:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
0 голосов
/ 27 марта 2012

Я заметил, что эти приложения очень четко знают свои требования.Они не будут работать, если (1) пользователь не разрешит локальные оповещения для этого приложения в меню «Настройки»> «Уведомления», и (2) приложение находится на первом месте, когда пользователь блокирует экран (например, оно не будет работать, если пользователь щелкнет)кнопка «Домой» для выхода из приложения и , затем блокирует экран).

Поэтому, вероятно, это сочетание локального уведомления и тихого звука, воспроизводимого в фоновом режиме.Беззвучный звук означает, что когда экран заблокирован, если приложение расположено спереди, оно не приостанавливается.Таким образом, локальное уведомление отправляется самому приложению, и приложение может ответить, издав звуковой сигнал.Или, возможно, нет тихого звука, а слышимый вами сигнал будильника - это просто пользовательский звук, прикрепленный к локальному уведомлению (но если это так, то мне не понятно, почему приложение должно быть в передней части, когда экран заблокирован).

Кроме того, хотя я не проверял это, поведение переключателя тишины на iPhone могло измениться в 5.1 в ответ на инцидент с Малером (http://www.nytimes.com/2012/01/13/nyregion/ringing-finally-stopped-but-concertgoers-alarm-persists.html). Это объясняет, почему разработчики комментируют, что онимог сделать это до 5.1.

0 голосов
/ 15 марта 2012

Загляните в SystemSoundID; их звук воспроизводится с помощью ползунка «Звонок и оповещения» в меню «Настройки»> «Звуки», несмотря на громкость, заданную кнопками громкости и бесшумным режимом.

...