Можно ли запустить NSThread или NSTimer на устройстве iOS 4, когда оно переходит в фоновое состояние?

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

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

Это возможно?

Если нет, то есть ли другой метод достижения этой функциональности?


person Sabobin    schedule 19.08.2011    source источник


Ответы (3)


Уловка состоит в том, чтобы не использовать MPMusicPlayerController, поскольку, когда ваше приложение переходит в фоновый режим, оно фактически передает управление приложению iPod (вы можете проверить это, закрыв приложение и открыв приложение iPod).

Для музыкального приложения, которое я сейчас разрабатываю, я использовал собственный музыкальный проигрыватель, используя AVAudioSession и AVPlayer (не AVAudioPlayer). Я реализовал очередь на плеере и источник данных (аналогичный UITableViewDatasource), который подпитывает очередь. Все это прекрасно работает в фоновом режиме и не имеет никакого отношения к приложению iPod (и в качестве дополнительного бонуса значок приложений появляется рядом с пультами дистанционного управления на панели многозадачности).

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

person Community    schedule 19.08.2011
comment
Спасибо, звучит интересно, но как вы на самом деле запускаете код в фоновом режиме? Вы используете тему или, возможно, задачу? iOS 4, похоже, довольно строго относится к тому, какие службы будут постоянно работать в фоновом режиме. В документации указывается, а именно музыкальный проигрыватель iPod, местоположение GPS и VoIP. Имея это в виду, как вы смогли реализовать свой музыкальный проигрыватель, чтобы обновлять его очередь на лету и т. Д. При работе в фоновом режиме? - person Sabobin; 19.08.2011
comment
Нет, в документации указано аудио, а не музыкальный проигрыватель iPod. - person ; 19.08.2011
comment
О, так вы говорите, потому что это звуковая служба, ОС поддерживает ее работу. - person Sabobin; 19.08.2011
comment
Ага. AVAudioSession информирует ОС о контексте, в котором вы используете звук, а AVPlayer отвечает за воспроизведение звука. - person ; 19.08.2011
comment
Спасибо, я посмотрю на это. - person Sabobin; 19.08.2011

Конечно. Это можно сделать в файле applicationDidEnterBackground: делегата приложения.

Из шаблона:

Если ваше приложение поддерживает выполнение в фоновом режиме, этот метод вызывается вместо applicationWillTerminate: когда пользователь завершает работу.

person Mundi    schedule 19.08.2011
comment
Мне известно о applicationDidEnterBackground: но даже если бы я установил таймер или поток в этом методе, не отключились бы они вместе с основным циклом выполнения процессов, когда приложение переходит в фоновое состояние? - person Sabobin; 19.08.2011
comment
Это непредсказуемо. Когда в телефоне заканчивается память из-за какого-то другого приложения, он закрывает все фоновые приложения, включая почту и т. Д. Но пока памяти достаточно, он должен просто продолжать. - person Mundi; 19.08.2011
comment
Интересно, попробую, спасибо за предложение. - person Sabobin; 19.08.2011

Ну да, и теперь вы не можете использовать NSTimer, потому что они недействительны. Вы можете запустить блок кода через GCD для работы в фоновом режиме, который будет иметь макс. время выполнения 10 мин.

person rckoenes    schedule 19.08.2011
comment
Хорошо, я хочу, чтобы правила применялись к музыкальному проигрывателю на протяжении всего времени, пока приложение находится в фоновом состоянии, возможно ли это? - person Sabobin; 19.08.2011
comment
Ну, вы можете указать, что ваше приложение должно воспроизводить звук в фоновом режиме. iOS позволит вашему приложению продолжать работу, пока идет аудиосеанс. Нет возможности пройти 10 минут. макс фонового исполнения. - person rckoenes; 19.08.2011