2010-07-01 15 views
18

La documentación está bastante mal escrita cuando se habla de reproducir audio en segundo plano. Da la impresión de que todo lo que tiene que hacer para seguir reproduciendo el audio que está reproduciendo es simplemente agregar un par de clave/valor al archivo info.plist y wallah, es mágico.Introducción de fondo en iOS4 para reproducir audio

Sin embargo, este no es el caso. Por ejemplo, si reproduzco un mp3 que dura 2 minutos, obviamente el audio es lo suficientemente largo como para poder reproducirlo después de presionar el botón de inicio para enviar mi aplicación al fondo. La cuestión es que, aunque tengo ese par de clave/valor en mi archivo info.plist, pausa el audio y luego reanuda la reproducción una vez que regreso a la aplicación.

Apple afirma que todos los marcos para el fondo de soporte de audio y el sonido deben continuar reproduciéndose hasta el punto en que finalice y luego Apple suspenderá su aplicación.

Entonces, mi pregunta es: ¿Qué están haciendo que me falta? ¿Debo utilizar también sus nuevos delegados o llamar al audio en el applicationDidEnterBackground? Para mí, eso no tendría sentido ya que no estoy guardando el estado (lo hacen por mí con el cambio rápido de la aplicación) o realmente estoy manejando cualquier cosa en el fondo que no sea el audio que dicen que se supone que se maneja de forma automática.

+0

lol @ "wallah". voila :) – h4xxr

+0

lo siento, tomé lecciones de ortografía de Dan Quayle :) – iwasrobbed

Respuesta

17

La única parte que falta en la documentación es que necesita configurar su sesión de audio.

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

Añade eso y estarás listo para ir.

+0

Esa debería ser la respuesta. –

+0

¡Al menos alguien se da cuenta! :) –

+0

Josh, estabas obteniendo la marca de verificación, no te preocupes :) Funcionó como un encanto. stackoverflow estaba estropeando mi lenta red así que tuve que cerrar el navegador para corregirlo – iwasrobbed

22

También debe realizar llamadas a beginBackgroundTaskWithExpirationHandler: antes de comenzar una canción (hágalo todo el tiempo ya sea en primer plano o no) y endBackgroundTask cuando termine.

Esto le dice a iOS que desea poder continuar el proceso, incluso si su aplicación se pone en segundo plano. No crea una nueva tarea o hilo, solo es un indicador para iOS que desea seguir ejecutando. El audio se reproducirá hasta el final sin esto, pero cuando se complete si desea iniciar otra pista debe poder ejecutar en segundo plano.

Se puede utilizar la siguiente manera:

// ivar, initialized to UIBackgroundTaskInvalid in awakeFromNib 
UIBackgroundTaskIdentifier bgTaskId; 

Al iniciar un reproductor de audio se guarda la ID de tarea BG:

if ([audioPlayer play]) { 
    bgTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 
} 

Ahora el audioPlayerDidFinishPlaying: devolución de llamada se sigue produciendo, porque hemos dicho IOS que estamos haciendo una tarea que debe continuar incluso si nos ponen en segundo plano. De esa forma obtenemos la devolución de llamada y podemos comenzar el próximo archivo de audio.

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)success 
{ 
    UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid; 

    if (self.haveMoreAudioToPlay) { 
     newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 
     [self playNextAudioFile]; 
    } 

    if (bgTaskId != UIBackgroundTaskInvalid) { 
     [[UIApplication sharedApplication] endBackgroundTask: bgTaskId]; 
    } 

    bgTaskId = newTaskId; 
}  
+0

¿Por qué comenzarías una tarea en segundo plano solo para reproducir audio? Esto no es necesario en absoluto. –

+0

¿Crees que esto lo mantendría con vida solo por el tiempo que Apple asigna cuando solicitas 'beginBackgroundTaskWithExpirationHandler' o seguirá jugando mientras uses' audioDidFinishPlaying' para reproducir un sonido o reproducir un sonido nuevo? – iwasrobbed

+0

+1 a progrmr por ir más allá ya que también necesitaré eso para lo que estoy haciendo (no estoy seguro de por qué alguien te votó negativamente, pero aprecio tu respuesta) – iwasrobbed

Cuestiones relacionadas