¿Reproducir música de background en la aplicación?

Quiero que el usuario pueda abrir la aplicación y que la música comience a reproducirse. Quiero que el usuario pueda ir a cualquier controller de vista y volver al inicial sin que se detenga la música. Quiero que el bucle indefinidamente.

He intentado poner en el método viewDidLoad del controller de vista inicial para que comience a reproducirse. Lo que sucede es que el usuario abandona el controller de vista inicial y cuando vuelven, la música comienza a reproducirse nuevamente, superponiendo la copy original.

Para remediar esto, pongo una instrucción if que comtesting si el sonido ya está en reproducción para no iniciar otra copy y el método viewDidLoad ignora por completo la instrucción if y la reproduce de todos modos. También intenté usar viewDid/WillAppear . He intentado poner el sonido en el delegado de la applicationDidLaunchWithOptions en el método applicationDidLaunchWithOptions y obtuve un silencio completo.

Usar un singleton también funciona:

 import AVFoundation class MusicHelper { static let shanetworkingHelper = MusicHelper() var audioPlayer: AVAudioPlayer? func playBackgroundMusic() { let aSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("coolsong", ofType: "mp3")!) do { audioPlayer = try AVAudioPlayer(contentsOfURL:aSound) audioPlayer!.numberOfLoops = -1 audioPlayer!.prepareToPlay() audioPlayer!.play() } catch { print("Cannot play the file") } } } 

Entonces puedes usarlo desde cualquier class (según Swift 2.1)

 MusicHelper.shanetworkingHelper.playBackgroundMusic() 

Así es como hice el mío. Agregue este código a cualquier lugar FUERA de la escena de class donde desea que la música comience a reproducirse. Incluso puede crear un file Swift completamente nuevo y agregar este código allí (importar AVFoundation)

 var backgroundMusicPlayer: AVAudioPlayer! func playBackgroundMusic(filename: String) { //The location of the file and its type let url = NSBundle.mainBundle().URLForResource(filename, withExtension: "mp3") //Returns an error if it can't find the file name if (url == nil) { println("Could not find the file \(filename)") } var error: NSError? = nil //Assigns the actual music to the music player backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: url, error: &error) //Error if it failed to create the music player if backgroundMusicPlayer == nil { println("Could not create audio player: \(error!)") return } //A negative means it loops forever backgroundMusicPlayer.numberOfLoops = -1 backgroundMusicPlayer.prepareToPlay() backgroundMusicPlayer.play() } 

Después de que tenga eso, vaya a la function didMoveToView y llame a la function con el nombre del file.

 playBackgroundMusic("IntroMusic") 

Acabo de probarlo y funciona perfecto después de cambiar escenas.

Simplemente agregue "numberofLoops = -1" y se reproduce infinitamente en segundo plano.

Ejemplo (Swift):

 func playBackgroundMusic() { do { if let bundle = NSBundle.mainBundle().pathForResource("someMP3file", ofType: "mp3") { let alertSound = NSURL(fileURLWithPath: bundle) try AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.shanetworkingInstance().setActive(true) try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound) audioPlayer.numberOfLoops = -1 audioPlayer.prepareToPlay() audioPlayer.play() } } catch { print(error) } } 

Que te diviertas.

Encontré una solución. Declaré una propiedad del controller de vista llamada señal. Dije señal: ¿Bool? – Entonces, en viewDidLoad, pongo una instrucción if para reproducir solo la canción de background si signal == nil. Luego, en mis otros controlleres de vista, lo configuré para que cuando regresen al control principal, la propiedad de señal = falso. Entonces, la canción no se reproducirá nuevamente y todo funcionará correctamente.

Creo que deberías probar en tu file AppDelegate.swift. En la aplicación de método (….. didFinishLaunchingWithOptions …..) {} define tu AVAudioPlayer () y .play ()