2011-02-08 7 views
10

У меня есть приложение, которое будет отслеживать все, что пользователь делает в приложении iPod. Для этого я добавил несколько наблюдателей в NSNotificationCenter, например MPMusicPlayerControllerNowPlayingItemDidChangeNotification. Но моя проблема заключается в том, что я получаю только эти уведомления, когда мое приложение находится на переднем плане, если оно находится в фоновом режиме, система добавляет уведомление в очередь, а затем в следующий раз, когда мое приложение становится активным, оно доставляет его мне. Я не заинтересован в этой очереди, так как хочу получать уведомления в режиме реального времени.Получение уведомлений с приложением в фоновом режиме

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

Здесь я добавляю наблюдателя.

MPMusicPlayerController *iPodMediaPlayer = [MPMusicPlayerController iPodMusicPlayer]; 



NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter addObserver: self selector: @selector(handle_NowPlayingItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 

            object:iPodMediaPlayer]; 


[iPodMediaPlayer beginGeneratingPlaybackNotifications]; 

Кроме того, если добавить еще один вид объекта к наблюдателю вместо iPodMediaPlayer, наблюдатель не вызывается метод.

Спасибо большое,

Abras

ответ

6

IOS приложение приостанавливается, если они не находятся на переднем плане. Есть три исключения из этого правила. Вы можете выполнить код в фоновом режиме, если ваша заявка

a) Воспроизведение аудио. Это означает, что само приложение фактически генерирует аудио. Я понимаю, что объект MPMediaPlayerController iPodMusicPlayer управляет только воспроизведением внешнего процесса iPod, а не воспроизводит звук из самого приложения. Возможно, вам удастся добиться успеха, если вы вызовете applicationMusicPlayer вместо iPodMusicPlayer и установите соответствующие фонов фона в своих приложениях Info.plist. Это похоже на самый законный способ заставить ваше приложение работать, но вы не сможете контролировать воспроизведение iPod из iPod-приложения, только ваше приложение и системные аудио-элементы управления.

b) Получите ваше приложение, чтобы контролировать местоположение. Если приложение использует GPS, оно может продолжать выполняться в фоновом режиме. Недостатком этого является то, что GPS будет сбрасывать аккумулятор, и пользователи могут быть пропущены, что вы запрашиваете их местоположение.

c) Запросить UIApplication для дополнительного времени. Если вы используете метод beginBackgroundTask из UIApplication, ваше приложение будет продолжать работать в течение ограниченного промежутка времени в фоновом режиме. Если ваши пользователи будут входить в ваше приложение каждые десять минут или около того, это может сработать.

Надеюсь, что это поможет.

+0

Да, я знаю, что есть только три варианта. Но я подумал, что, возможно, есть способ зарегистрировать уведомление в системе, тогда ваше приложение будет нормально работать в фоновом режиме. Если пользователь делает что-то, что вызывает уведомление, Центр уведомлений разбудит ваше приложение, чтобы оно могло ответить на уведомление. После ответа он вернется в фоновый режим как обычно. – Abras

+0

@Abras: Вы узнали, как это сделать? У меня есть аудио приложение. И я хочу получать уведомления (когда появляются другие звуковые приложения), когда они находятся в фоновом режиме. Как мне это сделать? – Namratha

+0

@Abras Вы когда-нибудь это выясняли? – WMios

0

Многозадачность в iOS в настоящее время очень ограничена. Вы можете запустить фоновое задание с использованием метода beginBackgroundTaskWithExpirationHandler: (объекта UIApplication), но он должен завершить задачу конечной длины перед тем, как приостановить ее. Все фоновые задачи могут истекать (и заканчиваться) до завершения работы. Вы можете проверить, сколько времени ваше приложение может выполнить, проверив свойство backgroundTimeRemaining объекта приложения.

+0

Да, но это не то, что я хочу. Я хочу, чтобы мое приложение вызывалось каждый раз, когда пользователь запускал уведомление. – Abras

+0

Точно. Я говорю, что нет никакого способа сделать это, ну, насколько я могу судить. – MHC

+0

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

0

Как я здесь объяснил iOS receive Media Player Notifications when app is in background, похоже, нет способа получить уведомления от iPodMusicPlayer.

О Омар Raul Кази ответ:

а) я пытался, и я не имел успеха. Музыка нажала кнопку «домой». Я думаю, что этот флаг фона работает только для обычных AudioSessions, а не для MPMusicPlayer ...

б) Я не уверен, что это будет работать, и я не думаю, что Apple, хотела бы его, ища одобрения

с) Вы можете работать в фоновом режиме только синхронной задаче. Вы не можете ждать там уведомления. Я ошибаюсь?

Смежные вопросы