¿Cómo manejar la reproducción de audio de background mientras el dispositivo iOS está bloqueado o en otra aplicación?

Diseñando un sistema de música generativo para iOS, usando OpenFrameworks, necesitaría proporcionar un modo en el que el usuario pueda escuchar la música producida por la aplicación cuando:

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

Algunas aplicaciones como BLOOM, o despertador, funcionan así y proponen a los usuarios un cambio para habilitar / deshabilitar esta function.

¿Algún consejo para eso?

Reproducción de audio de background

Una aplicación que reproduce o graba audio continuamente (incluso mientras la aplicación se ejecuta en segundo plano) puede registrarse para realizar esas tareas en segundo plano. Habilita la compatibilidad de audio desde la sección Modos en segundo plano de la pestaña Capacidades en su proyecto Xcode. (También puede habilitar esta compatibilidad al include la key UIBackgroundModes con el valor de audio en el file Info.plist de la aplicación). Las aplicaciones que reproducen contenido de audio en segundo plano deben reproducir contenido audible y no silenciar.

Referencia de Apple "Reproducción y grabación de audio de background"

Asegurarse de que el audio continúe cuando las cerraduras de pantalla

Para habilitar / deshabilitar esta function encontré Activar y Desactivar tu session de audio , no lo he probado yo mismo, pero parece lo que necesitas.

Necesita hacer algunos cambios en el file Plist.

es decir, 1) Establecer el modo de background requerido en la aplicación reproduce audio

2) set Application no se ejecuta en segundo plano a NO.

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

Entonces, necesitas escribir estos códigos en AppDelegate

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

Realice los siguientes cambios en la configuration del proyecto xCode, así como en el código.

paso 1) Seleccione su file de proyecto en el Navegador de Xcode. Luego, desde la sección de Capacidades, active la subsección de los modos de background. Una vez que se le haya entregado la list de modos de background, marque el interruptor Audio y Airplay.

stp 2) Utiliza el siguiente código rápido, básicamente necesitas configurar la session de audio para tu 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.shanetworkingInstance() 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 session de reproducción de audio reproducirá la reproducción de su aplicación, incluso si la aplicación está en segundo plano o si el teléfono está en modo silencioso o si el dispositivo está bloqueado.

Mira en este tutorial. Tiene algunos ejemplos de services en segundo plano

http://www.raywenderlich.com/29948/backgrounding-for-ios

Necesita hacer algunos cambios en el file Plist.

1) Establecer el modo de background requerido en la aplicación reproduce audio

2) set Application no se ejecuta en segundo plano a NO.

 let dispatchQueue = DispatchQueue.global() dispatchQueue.async(execute: { do{ let session = AVAudioSession.shanetworkingInstance() 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)") } }); 

También puedes usar este código:

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