Предисловие: я создаю приложение для будильника. Многие другие приложения для сигнализации, такие как Alarm Clock Pro, могут воспроизводить сигнал тревоги, когда экран заблокирован, а приложение находится на переднем плане. Их сигналы тревоги могут играть неограниченное количество времени и могут постепенно увеличивать громкость с использованием объема системы. Они также не контролируют элементы управления музыкой (если вы откроете экран многозадачности и прокрутите до воспроизведения звука, вы не увидите их значок)
У меня возникают проблемы с воспроизведением этой функциональности.
Для воспроизведения сигналов тревоги, когда приложение находится на переднем плане, мы запускаем локальные уведомления, которые отлично работают. У меня ограниченный успех, пока экран заблокирован (приложение и приложение находятся в состоянии "Неактивно" )
Я использовал следующие методы:
-
Выполняйте
NSTimer
каждую секунду с фоновой задачей, когда экран заблокирован. Мне удалось закрыть приложение за 10 минут, но я не смог воспроизвести звук. когда пришло время -
Воспроизведите 1-секундный тихий звук, используя
AVAudioPlayer
. Когда звук закончится, воспроизведите звук и проверьте, находится ли приложение в состоянии "Неактивный (заблокированный экран)". Если он находится в состоянии заблокированного экрана, и на нем время для воспроизведения сигнала тревоги, воспроизведите его. Проблема здесь в том, что я должен использовать[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
чтобы продолжить обновление песни, пока она находится в фоновом режиме. Этот метод отобразит "Wake" в музыкальных элементах управления и остановит любую музыку, которую мы хотим избежать.
- Комбинация # 1 и # 2. Когда приложение открывается, воспроизводите тихий звук при бесконечном повторе. Когда экран заблокирован, запустите таймер, чтобы проверить, не было ли его время для воспроизведения сигнала тревоги. Когда придет время для воспроизведения сигнала тревоги, переключите звук без звука на звуковой сигнал. Система в конечном итоге заставит закрыть приложение
Связанные знания, которые помогли, но не решили мой вопрос:
- Как начать воспроизведение звука в бесшумном режиме и заблокирован в iOS 6?
- iOS 5 глубокое предотвращение сна
- Возобновление выполнения кода после прерывания, когда приложение находится в фоновом режиме
- Как играть в фоновом режиме iphone sdk
Резюме. Пока экран заблокирован и в приложении находится на переднем плане, я не могу предотвратить уничтожение процесса после отметки 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% процессора, когда приложение находится в фоновом режиме. Оказывается, мое приложение было сосать процессор. Так что все это хорошо работает сейчас:)