Подтвердить что ты не робот

Воспроизведение звука, когда приложение находится на переднем плане, и экран заблокирован - iOS

Предисловие: я создаю приложение для будильника. Многие другие приложения для сигнализации, такие как Alarm Clock Pro, могут воспроизводить сигнал тревоги, когда экран заблокирован, а приложение находится на переднем плане. Их сигналы тревоги могут играть неограниченное количество времени и могут постепенно увеличивать громкость с использованием объема системы. Они также не контролируют элементы управления музыкой (если вы откроете экран многозадачности и прокрутите до воспроизведения звука, вы не увидите их значок)

У меня возникают проблемы с воспроизведением этой функциональности.

Для воспроизведения сигналов тревоги, когда приложение находится на переднем плане, мы запускаем локальные уведомления, которые отлично работают. У меня ограниченный успех, пока экран заблокирован (приложение и приложение находятся в состоянии "Неактивно" )

Я использовал следующие методы:

  • Выполняйте NSTimer каждую секунду с фоновой задачей, когда экран заблокирован. Мне удалось закрыть приложение за 10 минут, но я не смог воспроизвести звук. когда пришло время

  • Воспроизведите 1-секундный тихий звук, используя AVAudioPlayer. Когда звук закончится, воспроизведите звук и проверьте, находится ли приложение в состоянии "Неактивный (заблокированный экран)". Если он находится в состоянии заблокированного экрана, и на нем время для воспроизведения сигнала тревоги, воспроизведите его. Проблема здесь в том, что я должен использовать

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

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

  1. Комбинация # 1 и # 2. Когда приложение открывается, воспроизводите тихий звук при бесконечном повторе. Когда экран заблокирован, запустите таймер, чтобы проверить, не было ли его время для воспроизведения сигнала тревоги. Когда придет время для воспроизведения сигнала тревоги, переключите звук без звука на звуковой сигнал. Система в конечном итоге заставит закрыть приложение

Связанные знания, которые помогли, но не решили мой вопрос:

Резюме. Пока экран заблокирован и в приложении находится на переднем плане, я не могу предотвратить уничтожение процесса после отметки 10 минут.

UPDATE

В итоге я использовал https://github.com/mruegenberg/MMPDeepSleepPreventer, который позволил мне воспроизвести звук через 10 минут. Тем не менее, это съедает аккумулятор, как сумасшедший. Мне нужно найти более эффективное решение.

ОБНОВЛЕНИЕ 2

Я загрузил некоторые из http://marcopeluso.com/ приложений из магазина приложений. Он является создателем Deep Sleep Preventer. Я загрузил некоторые из его приложений и провел некоторые тесты инструментов и увидел, что его приложение не разряжает аккумулятор столько, сколько мое приложение (примерно 2,5% в час, как утверждалось где-то в его блоге). Я очень уверен, что мне нужно оптимизировать свое приложение, и проблемы с истощением батареи исчезнут, и мои проблемы будут решены!

ОБНОВЛЕНИЕ 3 Я закончил использование https://github.com/mruegenberg/MMPDeepSleepPreventer

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

4b9b3361

Ответ 1

См. мой ответ выше. В принципе, хотя

В итоге я использовал https://github.com/mruegenberg/MMPDeepSleepPreventer

Я запустил его в своем отдельном проекте xCode, и он использует только 0,5% процессора, когда приложение находится в фоновом режиме. Оказывается, это был мой код, который убивал процессор. Теперь все хорошо!

Ответ 2

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

  • Линейный PCM
  • MA4 (IMA/ADPCM)
  • μLaw
  • aLaw

Пользовательский звук может составлять 30 секунд или меньше. После инициализации объекта UILocalNotification вам нужно установить его свойство firedate, которое является датой и временем (также повторяющимся) для активации уведомления. Затем вы устанавливаете предупреждающее сообщение через alertBody (например, "пробуждение" ) и строку на кнопке оповещения через alertAction. Имя файла настраиваемого звука переходит в свойство soundName. Вы представляете свой экземпляр уведомления, вызывая scheduleLocalNotification:, метод UIApplication. Обратите внимание, что время, когда вы вызываете этот метод, не обязательно, а обычно нет, время, когда уведомление будет срабатывать. И вам нужно позвонить только один раз, даже если вы установите повторяющееся уведомление. Вы отменяете его, вызывая cancelLocalNotification:. Теперь ваша тревога должна воспроизводиться, находится ли ваше приложение на переднем плане, фон или даже не открывается.

Все это в здесь.