2012-05-03 12 views
22

El diseño de un sistema de música generativa para iOS, utilizando Openframeworks, que había necesidad de proporcionar un modo en el que el usuario puede escuchar la música producida por la aplicación cuando:¿Cómo manejar la reproducción de audio en segundo plano mientras el dispositivo iOS está bloqueado o en otra aplicación?

  • el dispositivo está bloqueado
  • el usuario utiliza otra aplicación

Algunas aplicaciones como BLOOM, o reloj de alarma, funcionan de esa manera y proponen a los usuarios un interruptor para habilitar/deshabilitar esta característica.

¿Algún consejo para eso?

Respuesta

34

Reproducción de audio de fondo

una aplicación que reproduce o graba audio de forma continua (aunque la aplicación es ejecutan en segundo plano) pueden inscribirse para realizar esas tareas en segundo plano . Habilita el soporte de audio desde la sección de modos de fondo de la pestaña Capacidades en su proyecto de Xcode. (También puede habilitar esta compatibilidad incluyendo la clave UIBackgroundModes con el valor de audio en el archivo Info.plist de su aplicación.) Las aplicaciones que reproducen contenido de audio en el fondo debe reproducir contenido audible y no silenciar.

Apple reference "Playing and Recording Background Audio"

Ensuring That Audio Continues When the Screen Locks

Para activar/desactivar esta función encontré Activating and Deactivating Your Audio Session, no he probado a mí mismo, pero parece que lo que necesita.

+1

Hola Danich y muchas gracias por su respuesta. ¿Hay alguna manera de cambiarlo en el tiempo de ejecución? – gluon

+0

Abrí otro hilo para este punto en particular: http://stackoverflow.com/questions/10504432/how-can-we-handle-enable-disable-background-audio-abilities-at-runtime-on-ios-de – gluon

+1

Lo siento, no noté su pregunta sobre habilitar/deshabilitar. Creo que un hilo nuevo no es una buena idea. Actualizado mi respuesta. Acepta, si crees que es útil. – DanSkeel

29

Tiene que hacer un par de cambios en el archivo plist.

decir 1) Establecer el modo de antecedentes requeridos para la aplicación juega aplicación no se ejecuta en segundo plano en NO de audio

2) Conjunto.

NSError *setCategoryErr = nil; 
NSError *activationErr = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr]; 
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr]; 

Entonces, tiene que escribir estos mucho código en AppDelegate

Ahora, puede ejecutar fácilmente audio mientras se bloquea la pantalla del teléfono o va en segundo plano.

+6

"La aplicación no se ejecuta en segundo plano" debe establecerse en "NO" – ctpenrose

+2

Esto es genial, gracias. También necesitaba configurar Capabilities> Background Modes> Audio & AirPlay – Dunc

+0

¿Dónde escribo este código exactamente? – Danpe

-1

También se puede utilizar este código:

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback error:NULL]; 

AVAudioSession *backgroundMusic = [AVAudioSession sharedInstance]; 

[backgroundMusic setCategory:AVAudioSessionCategoryPlayback error:NULL]; 
2

realizar los siguientes cambios en la configuración del proyecto Xcode, así como en el código.

paso 1) Seleccione su archivo de proyecto en el navegador de Xcode. Luego, desde la sección de Capacidades, enciende la subsección Modos de fondo. Una vez que se le haya asignado la lista de modos de fondo, marque el interruptor Audio & Airplay.

stp 2) Utilice el siguiente código rápido, básicamente debe configurar la sesión de audio para su aplicación.

var audioPlayer : AVAudioPlayer! 

@IBAction func playButtonClicked(sender : AnyObject){ 

    let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(dispatchQueue, { 

     if let data = NSData(contentsOfFile: self.audioFilePath()) 
     { 
      do{ 
       let session = AVAudioSession.sharedInstance() 

       try session.setCategory(AVAudioSessionCategoryPlayback) 
       try session.setActive(true) 

       self.audioPlayer = try AVAudioPlayer(data: data) 
       //self.audioPlayer.delegate = self 
       self.audioPlayer.prepareToPlay() 
       self.audioPlayer.play() 
      } 
      catch{ 
       print("\(error)") 
      } 
     } 
    }); 
} 

func audioFilePath() -> String{ 

    let filePath = NSBundle.mainBundle().pathForResource("mySong", ofType: "mp3")! 
    return filePath 
} 

Esta sesión de reproducción de audio se juega la reproducción de la aplicación, incluso si la aplicación está en segundo plano o el teléfono está en modo silencioso o el dispositivo está bloqueado.

0

Se necesitan hacer algunos cambios en el archivo plist.

1) Conjunto Requerido modo de fondo de la aplicación para reproducir audio que

2) del conjunto de aplicaciones no se ejecuta en segundo plano en NO.

let dispatchQueue = DispatchQueue.global() 
      dispatchQueue.async(execute: { 
        do{ 
         let session = AVAudioSession.sharedInstance() 

         try session.setCategory(AVAudioSessionCategoryPlayback) 
         try session.setActive(true) 

         self.isObjectAllocate = true 
         if self.isPlayed == false{ 
          self.playSound(soundName: "http://radio.zahraun.com:8000/live.m3u") 
          self.isPlayed = true 
          self.btnPlayAudio.setImage(#imageLiteral(resourceName: "pause") , for: .normal) 

         }else{ 
          self.audioPlayer.pause() 
          self.isPlayed = false 
          self.btnPlayAudio.setImage(#imageLiteral(resourceName: "audioPlay"), for: .normal) 
         } 
        } 
        catch{ 
         print("\(error)") 
        } 
      }); 
Cuestiones relacionadas