¿Cómo consigo mi AVPlayer para jugar mientras la aplicación está en segundo plano?

He hecho mi tarea … he estado leyendo aquí, los documentos, buscando en Google, astackndo … pero todavía no hay suerte en hacer que mi sonido se mantenga cuando el usuario hace que la aplicación entre en el fondo.

Lo que he hecho hasta ahora: Agregué UIBackgroundModes, audio al plist-file.

Primero este código:

radioAudio = [[AVAudioSession alloc] init]; [radioAudio setCategory:AVAudioSessionCategoryPlayback error:nil]; [radioAudio setActive:YES error:nil]; 

Luego esto:

 NSString *radioURL = @"http://xxx.xxx.xxx/radio.m3u"; radioPlayer = [[AVPlayer playerWithURL:[NSURL URLWithString:radioURL]] retain]; 

Pero tan pronto como el usuario toca el botón de inicio, mi sonido muere.

También encontré esto, pero aún no agregado, porque algunas cosas que he leído dicen que no es necesario;

 newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; if (newTaskId != UIBackgroundTaskInvalid && bgTaskId != UIBackgroundTaskInvalid) [[UIApplication sharedApplication] endBackgroundTask: bgTaskId]; bgTaskId = newTaskId; 

En este momento no tengo idea de a dónde debería ir para que mi AVPlayer deje que la radio cante mientras el usuario hace otras cosas en el teléfono. Estoy probando esto en un iPhone 4 con 4.2. Construyéndolo para 4.0.

¿Alguien tiene alguna sugerencia de lo que debería hacer?

Tuve el mismo problema, pero encontré una solución para esto …

Mira aquí: https://devforums.apple.com/message/395049#395049

El contenido del enlace de arriba:


¡Reemplaza APPNAME con el nombre de tu propia aplicación!

Estoy en iOS 4.2.1

EDITAR: Trabajando con iOS5 + 6 + 7 beta hasta el momento

Agregue UIBackgroundModes en APPNAME-Info.plist , con la aplicación de selección reproduce audio

A continuación, agregue el marco AudioToolBox marcos de la carpeta.

En APPNAMEAppDelegate.h agregue:

 #import  #import  

por lo que se ve así:

 ... #import  #import  #import  ... 

En APPNAMEAppDelegate.m agregue lo siguiente:

 // Set AudioSession NSError *sessionError = nil; [[AVAudioSession sharedInstance] setDelegate:self]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError]; /* Pick any one of them */ // 1. Overriding the output audio route //UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; //AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); // 2. Changing the default output audio route UInt32 doChangeDefaultRoute = 1; AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); 

en el

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

pero antes de las dos líneas:

 [self.window addSubview:viewController.view]; [self.window makeKeyAndVisible]; 

Construya su proyecto y vea si hay algún error. De lo contrario, intente eliminar errores en el dispositivo basado en el simulador, PUEDE fallar en el simulador.

Espero que esto ayude a otros con el mismo problema …

ACTUALIZAR IOS 11.2 con Swift 4:

Ahora, si está utilizando AVPlayer para reproducir archivos de música, también debe configurar MPNowPlayingInfoCenter.default() para mostrar ahora la información de reproducción en la pantalla de locking.

El siguiente código mostrará los controles de reproducción en la pantalla, pero no podrá responder ningún comando.

Si también desea que los controles funcionen, debe consultar el proyecto de ejemplo de Apple aquí: https://developer.apple.com/library/content/samplecode/MPRemoteCommandSample/Introduction/Intro.html#//apple_ref/doc/uid/TP40017322

El código de muestra de Apple lo cubre todo pero lo encuentro confuso.

Si quieres reproducir el sonido y mostrar los controles en la pantalla de locking, estos pasos te irán bien.

NOTA IMPORTANTE: si NO está utilizando AVPlayer para reproducir sonido. Si está utilizando algunas bibliotecas de terceros para generar sonido o reproducir un archivo de sonido, debe leer los comentarios dentro del código. Además, si está utilizando ios simulator 11.2, no podrá ver ningún control en la pantalla de locking. Deberías usar un dispositivo para ver cómo funciona.


1- Seleccionar proyecto -> capacidades -> configurar modos de fondo ENCENDIDO -> marcar Audio, AirPlay y Imagen en Imagen

ios 11 configuración de audio de fondo

2- El archivo AppDelegate.swift debería verse así:

 import UIKit import AVFoundation @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) //!! IMPORTANT !! /* If you're using 3rd party libraries to play sound or generate sound you should set sample rate manually here. Otherwise you wont be able to hear any sound when you lock screen */ //try AVAudioSession.sharedInstance().setPreferredSampleRate(4096) } catch { print(error) } // This will enable to show nowplaying controls on lock screen application.beginReceivingRemoteControlEvents() return true } } 

3- ViewController.swift debería verse así:

 import UIKit import AVFoundation import MediaPlayer class ViewController: UIViewController { var player : AVPlayer = AVPlayer() override func viewDidLoad() { super.viewDidLoad() let path = Bundle.main.path(forResource: "music", ofType: "mp3") let url = URL(fileURLWithPath: path!) // !! IMPORTANT !! /* If you are using 3rd party libraries to play sound or generate sound you should always setNowPlayingInfo before you create your player object. right: self.setNowPlayingInfo() let notAVPlayer = SomePlayer() wrong(You won't be able to see any controls on lock screen.): let notAVPlayer = SomePlayer() self.setNowPlayingInfo() */ self.setNowPlayingInfo() self.player = AVPlayer(url: url) } func setNowPlayingInfo() { let nowPlayingInfoCenter = MPNowPlayingInfoCenter.default() var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]() let title = "title" let album = "album" let artworkData = Data() let image = UIImage(data: artworkData) ?? UIImage() let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { (_) -> UIImage in return image }) nowPlayingInfo[MPMediaItemPropertyTitle] = title nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = album nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo } @IBAction func startPlayingButtonPressed(_ sender: Any) { self.player.play() } 

ANTIGUA RESPUESTA IOS 8.2:

La respuesta de Patrick es totalmente correcta.

Pero voy a escribir lo que hago para iOS 8.2 :

Agregué los modos de fondo de info.plist de mi aplicación a continuación:

enter image description here

Y en mi AppDelegate.h agrego estas importaciones:

 #import  #import  

Luego en mi AppDelegate.m escribí la aplicación didFinishLaunchingWithOptionsthis exactamente como a continuación:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; return YES; } 

Ahora la aplicación sigue reproduciendo música incluso si la pantalla está bloqueada 🙂

Realicé correctamente el audio en segundo plano agregando lo siguiente a mi applicationDidFinishLaunching

 // Registers this class as the delegate of the audio session. [[AVAudioSession sharedInstance] setDelegate: self]; // Allow the app sound to continue to play when the screen is locked. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

iOS 9 Swift

Todo lo que debe necesitar es agregar lo siguiente a su didFinishLaunchingWithOptions

 do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) } catch { //TODO } 

Tiene un buen ejemplo de una aplicación de fondo de GPS que reproduce sonidos incluso cuando está en segundo plano:

http://www.informit.com/articles/article.aspx?p=1646438&seqNum=5

En este ejemplo, se usa AudioToolbox.

Hice una prueba yo mismo y funciona: crea un proyecto simple que supervisa la publicación GPS ( location UIBackgroundModes ) y cada x posición recibida, reproduce un sonido usando

AudioServicesPlaySystemSound(soundId);

Luego, si coloca el audio como parte de UIBackgroundModes los sonidos se reproducirán, incluso si la aplicación ya no está en primer plano.

¡He hecho una prueba así y funciona bien!

(No logré que funcionara con AVPlayer, así que recurrí a AudioToolbox)

Tengo el mismo problema y encontré la solución en Apple Docs: https://developer.apple.com/library/ios/qa/qa1668/_index.html

P: ¿Cómo me aseguro de que mis medios continuarán reproduciéndose cuando utilice AV Foundation mientras mi aplicación está en segundo plano?

R: Debe declarar que su aplicación reproduce contenido audible mientras está en segundo plano, y asignarle una categoría apropiada a su sesión de audio. Consulte también Consideraciones especiales para medios de video .