En Swift, ¿cómo permito que otras aplicaciones continúen reproduciendo audio cuando mi aplicación está abierta?

Miré a mi alnetworkingedor y encontré preguntas vagamente similares, pero nada del otro modo … Me disculpo si perdí la respuesta en alguna parte.

Estoy terminando un juego que escribí en Swift usando SpriteKit.

La mayoría de los otros juegos que he jugado, puedo tener itunes o algo tocando música en segundo plano, y aún escucharlos mientras estoy jugando un juego.

Como estoy jugando mi juego, noto que cierra automáticamente el audio de otras aplicaciones.

No AVAudioPlayer para el sonido, ya que actualmente solo tengo una pequeña cantidad de efectos de audio, por lo que solo estaba usando una acción SKAction.playsoundfilenamed en su lugar.

Tengo lógica allí para activar y desactivar mis sonidos, pero eso es simplemente usar alguna lógica interna de if / else.

Me pregunto si tal vez hay alguna propiedad de AVAudio que pueda establecer que permitirá que el audio de otras aplicaciones continúe reproduciéndose cuando el mío esté abierto. No puedo encontrar esto en la documentation.

¡Gracias!

Establezca su categoría AVAudioSession en Ambient .

 import AVFoundation.AVAudioSession AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryAmbient, error: nil) 

Esta categoría también es apropiada para aplicaciones de estilo "play along", como un piano virtual que un usuario juega mientras se reproduce la aplicación de música. Cuando usa esta categoría, el audio de otras aplicaciones se mezcla con su audio. Su audio se silencia con el locking de pantalla y con el interruptor Silent (llamado el interruptor Ring / Silent en el iPhone).

En Xcode 8.2.1, Swift 3 (última syntax), esto funcionó para mí:

 import AVFoundation override func viewDidLoad() { super.viewDidLoad() let audioSession = AVAudioSession.shanetworkingInstance() do { try audioSession.setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers]) try audioSession.setActive(true) }catch{ // handle error } // the rest of your code } 

A partir de xCode 7 14 de octubre de 2015, esto funciona para mí.

Ponga esto en el GameViewController.swift según la versión de Swift que esté usando.

 //Swift 2.2 import AVFoundation.AVAudioSession //Swift 3.0 import AVFoundation 

Y coloque este código en ViewDidLoad:

 try! AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryAmbient) 

El uso de "try" es cuando quiere que el progtwig haga algo y luego detecte un error. Es un manejador de errores. Al agregar el signo de exclamación, estás diciendo "Sé que esto no va a fallar".

Esto funciona para mí. Estoy reproduciendo música de background ya que mi aplicación también lo es.

Llama a este código al iniciar la aplicación para que tu AVAudioSession permita que otras aplicaciones suenen:

 let audioSession = AVAudioSession.shanetworkingInstance() audioSession.setCategory(AVAudioSessionCategoryPlayback, withOptions:AVAudioSessionCategoryOptions.MixWithOthers, error: nil); audioSession.setActive(true, error: nil) 

No estoy seguro de si la architecture de su viewController , pero podría intentar ejecutar esto en viewDidLoad o crear un método independiente al que se llame dentro de viewDidLoad .

Puede haber un mejor lugar para este código, pero sin saber cómo se ve el código de su aplicación, puede pegarlo allí para ver si puede hacerlo funcionar.

 // this goes at the top w/ your import statements import AVFoundation // you could put this in your viewDidLoad or wherever it's appropriate for your code let session = AVAudioSession.shanetworkingInstance() session.setCategory(AVAudioSessionCategoryAmbient, withOptions: nil, error: nil) session.setActive(true, withOptions: nil, error: nil) 

Código de ejemplo de GitHub

AVAudioSession class de reference