Аудио голос за кадром, когда iPhone заблокирован - PullRequest
0 голосов
/ 30 января 2019

Решение ниже

Я работаю над запущенным приложением, которое дает инструкцию по озвучке в начале каждого упражнения.Он работает, как задумано, когда устройство активно, но не работает, когда телефон заблокирован.[ Текущий звук продолжается, но в будущем звук не воспроизводится. ]

Вопрос Как начать воспроизведение звука за кадром, когда пользователь iPhone заблокирован.

В настоящее время я отслеживаю тренировку, используя Timer.scheduledTimer, для 2 отображаемых таймеров [текущая активность и общая тренировка].Когда таймер достигает заданного времени ближе к концу одного действия, закадровый звук воспроизводится, чтобы ввести следующее действие. Таймер запускает звук, и я считаю, что это проблема .Я могу приостановить тренировку, пропустить секции и все работает нормально - до тех пор, пока устройство не заблокировано.

Если при нажатии кнопки «Домой» или блокировке iPhone воспроизводится голос за кадром, он продолжает воспроизводиться, как и ожидалось.Проблема в том, что таймер не срабатывает, поэтому следующий голос за кадром [скажем, 90 секунд] никогда не воспроизводится.

В некоторых ответах и ​​комментариях, которые я читал, сказано, что эта функция просто не работает.это возможно в iOS.Приложение Couch to 5k https://itunes.apple.com/gb/app/one-you-couch-to-5k/id1082307672?mt=8 использует эту функциональность, поэтому я знаю, что это возможно, я просто не знаю, как они это делают.[Это будет специальный участник, который загрузит его, чтобы понять, что я имею в виду:)]

По результатам поиска я прочитал много постов, в которых говорится, что Timer или NSTimer не может работать, когдаприложение находится в фоновом режиме или телефон заблокирован.Любые посты, в которых говорится, что он может работать, устарели и основаны на iOS4 / 5

. Я читал о предложениях по использованию тишины и, по сути, наличию 1 длинного аудиофайла.Хотя это может создать некоторые новые проблемы для пропуска разделов в тренировке, я также прочитал комментарии, в которых говорится, что такое поведение не пройдет тестирование Apple приложения для AppStore.Третий недостаток - увеличение размера моего аудиофайла.

Опция, которую я видел, - это локальные уведомления, однако я пока не вижу пример того, как проигрывать голос за кадром, когда приложение находится вbackground.

Как мне достичь той же функциональности, что и в приложении Couch to 5k?

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Хорошо, я разработал решение для воспроизведения звуковых подсказок для пользователя в течение 30-минутной тренировки, даже если iPhone заблокирован или приложение находится в фоновом режиме. Приложение было отправлено и одобрено для AppStore .

Чтобы приложение работало должным образом, я использую 2 AVAudioPlayers;один воспроизводит голос за кадром, другой воспроизводит 15-минутную дорожку молчания (так как это отдельная дорожка, и она просто тихая, это низкое качество .mp3 и только добавило 900 КБ к размеру приложения).15 минут значительно превышают любой интервал между наложением голоса, поэтому он отлично работает.

Когда пользователь начинает упражнение, воспроизводится первая звуковая подсказка.С этого момента, пока пользователь не остановит упражнение, в фоновом режиме будет воспроизводиться звук.Поскольку воспроизводится фоновое аудио, таймер по-прежнему работает.

Когда голос за кадром заканчивается, вызывается метод AVAudioPlayerDelegate audioPlayerDidFinishPlaying.В рамках этого метода я сбрасываю свойства звука [я объясню почему в ближайшее время], создаю экземпляр моего молчания AVAudioPlayer и начинаю воспроизведение 15-минутного трека молчания.Воспроизведение другой дорожки с использованием этого метода делегата означает, что в фоновом звуке нет реального перерыва, поэтому приложение остается в живых.С приложением «живой» таймер продолжает обратный отсчет.Когда пришло время для другого наложения голоса, таймер вызывает метод, который сбрасывает категорию аудио, создает мой голос за кадром AVAudioPlayer и воспроизводит голос за кадром.Этот процесс повторяется до окончательного озвучивания.Когда это завершается, дальнейшая пауза не воспроизводится, и приложение можно безопасно подключить к фону.

Закадровый звук должен подавить музыку пользователя [уменьшает громкость музыки, чтобы звук был четко слышен].Тихий звук не должен этого делать, музыка должна продолжать играть на полной громкости.Поскольку оба AVAudioPlayers используют AVAudioSession.sharedInstance, я обнаружил, что мне пришлось деактивировать sharedInstance, сбросить свойства с или без .duckOthers, а затем повторно активировать sharedInstance перед созданием моего AVAudioSession.Это тогда дало мне желаемый результат.Постоянный фоновый звук, который воспроизводит музыку пользователя только при воспроизведении голоса за кадром.

do{
    try AVAudioSession.sharedInstance().setActive(false)
    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.interruptSpokenAudioAndMixWithOthers, .duckOthers])
    try AVAudioSession.sharedInstance().setActive(true)
} catch{
        print(error.localizedDescription)
}

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

0 голосов
/ 05 июня 2019

Мое понимание VoiceOver приводит меня к тому, что только приложение переднего плана может контролировать то, что оно читает.

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

Я предлагаю взглянуть на синтез речи или AVAudioSession класс включает фоновое аудио : оба могут быть хорошими обходными путями в фоновом режиме: попробуйте и дайте нам знать.; О)

...