2011-02-08 7 views
10

Tengo una aplicación que hará un seguimiento de todo lo que hace el usuario en la aplicación de iPod. Para hacer esto, agregué algunos observadores a NSNotificationCenter, como MPMusicPlayerControllerNowPlayingItemDidChangeNotification. Pero mi problema es que solo recibo esas notificaciones cuando mi aplicación está en primer plano, si está en segundo plano, el sistema agrega la notificación a una cola y la próxima vez que mi aplicación se activa, me la entrega. No tengo ningún interés en esta cola, ya que quiero recibir notificaciones en tiempo real.Recibir notificaciones con la aplicación en el modo de fondo

¿Hay alguna forma de que reciba esas notificaciones, incluso si mi aplicación está suspendida? Quiero ejecutar solo 3 líneas de código cada vez que obtengo estas notificaciones de NowPlayingItemDidChange, por ejemplo.

Aquí es donde agrego el observador.

MPMusicPlayerController *iPodMediaPlayer = [MPMusicPlayerController iPodMusicPlayer]; 



NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

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

            object:iPodMediaPlayer]; 


[iPodMediaPlayer beginGeneratingPlaybackNotifications]; 

Además, si añado otro tipo de objeto para el observador en lugar de iPodMediaPlayer, el observador no se llame al método.

Muchas gracias, aplicaciones

Abras

Respuesta

6

iOS se suspenden cuando no están en el primer plano. Hay tres excepciones a esta regla. Puede ejecutar código en segundo plano si su aplicación es

a) Reproducción de audio. Esto significa que la aplicación en sí está generando audio. Tengo entendido que el objeto MPMediaPlayerController iPodMusicPlayer solo controla la reproducción del proceso del iPod externo, en lugar de reproducir el audio de la aplicación. Tal vez podría tener algún éxito si llama a applicationMusicPlayer en lugar de iPodMusicPlayer y establece los indicadores de fondo apropiados en sus aplicaciones Info.plist. Esta parece ser la forma más legítima de hacer que tu aplicación funcione, pero no podrás controlar la reproducción del iPod desde la aplicación del iPod, solo tu aplicación y los controles de audio del sistema.

b) Obtenga su aplicación para supervisar la ubicación. Si la aplicación está usando el GPS, puede continuar ejecutándose en segundo plano. Lo malo de esto es que el GPS va a agotar la batería y es posible que los usuarios se den cuenta de que está solicitando su ubicación.

c) Pregunte a UIApplication por tiempo extra. Si usa el método beginBackgroundTask de UIApplication, su aplicación continuará ejecutándose durante un período finito en segundo plano. Si sus usuarios van a ingresar a su aplicación cada diez minutos más o menos, esto podría funcionar también.

Espero que ayude.

+0

Sí, sé que solo hay tres opciones. Pero pensé que tal vez había una manera de registrar la notificación en el sistema, luego tu aplicación entraría en modo de fondo normalmente. Si el usuario hace algo que desencadena la notificación, el Centro de notificaciones activará su aplicación solo para que pueda responder a la notificación. Después de responder, volvería al modo de fondo de forma normal. – Abras

+0

@Abras: ¿Has descubierto cómo hacer esto? Tengo una aplicación de audio. Y quiero que reciba notificaciones (cuando surjan otras aplicaciones de audio) cuando esté en segundo plano. ¿Cómo lo hago? – Namratha

+0

@Abras ¿Alguna vez resolvió esto? – WMios

0

La multitarea en iOS es actualmente muy restringida. Puede iniciar una tarea en segundo plano utilizando el método beginBackgroundTaskWithExpirationHandler: (de un objeto UIApplication), pero está destinado a finalizar una tarea de longitud determinada antes de suspenderse. Todas las tareas en segundo plano pueden caducar (y terminar) antes de que finalice su trabajo. Puede verificar cuánto tiempo más se puede ejecutar su aplicación marcando backgroundTimeRemaining propiedad del objeto de la aplicación.

+0

Sí, pero eso no es lo que quiero. Quiero hacer que mi aplicación se llame cada vez que el usuario active la notificación. – Abras

+0

Exactamente. Estoy diciendo que no hay forma de hacerlo, bueno, hasta donde sé. – MHC

+0

Sí, gracias por el consejo. Creo que mi opción será implementar mi propio iPod y compilarlo en mi aplicación. No será fácil de usar, pero al menos puedo lograr lo que quiero. – Abras

0

Como expliqué aquí iOS receive Media Player Notifications when app is in background, parece que no hay forma de recibir notificaciones de iPodMusicPlayer.

sobre RESPUESTA Omar Raúl Qazi:

a) i intentado y he tenido ningún éxito. La música siguió bajando al presionar el botón de inicio. Creo que esta bandera de fondo solo funciona para AudioSessions normal y no para MPMusicPlayer ...

b) No estoy seguro de que esto iba a funcionar y no creo que Apple podría gustar la hora de buscar la aprobación

c) Se puede ejecutar en segundo plano única tarea sincrónica. No puede esperar allí para recibir una notificación. ¿Me equivoco?

Cuestiones relacionadas