UIWebView: el audio HTML5 se detiene en iOS 6 cuando la aplicación entra en segundo plano

Buen día,

Mi aplicación es una aplicación de reproducción de música. Controlo el <audio> -Tag con Javascript. Hasta el momento no hay problemas, jugar, pausar, los botones siguientes y anteriores funcionan. Cuando suspendo el dispositivo en iOS 5, la música sigue reproduciéndose, pero la próxima canción automática no funciona. Cuando no está en modo de espera, funciona. Y en iOS 6, justo después de presionar el button, la música se desvanece.

El button Reproducir / Pausa en la pantalla de locking funciona en iOS 5, pero no en iOS 6.

Comenzando con iOS 6, DEBE configurar la categoría de la session de audio como 'reproducción' antes de crear UIWebView. Esto es todo lo que tienes que hacer. No es necesario hacer que la session esté activa.

Esto también debería usarse para video html, ya que si no configura la session, su video se silenciará cuando el interruptor del timbre esté apagado.

 #import <AVFoundation/AVFoundation.h> AVAudioSession *audioSession = [AVAudioSession shanetworkingInstance]; BOOL ok; NSError *setCategoryError = nil; ok = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; if (!ok) { NSLog(@"%s setCategoryError=%@", __PRETTY_FUNCTION__, setCategoryError); } 

Asegúrese de que su destino se vincula con el marco AVFoundation.


Si usa Cordova, el file que necesita modificar es platforms/ios/MyApp/Classes/AppDelegate.m , y terminará pareciéndose a esto:

 #import "AppDelegate.h" #import "MainViewController.h" #import <AVFoundation/AVFoundation.h> @implementation AppDelegate - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { AVAudioSession *audioSession = [AVAudioSession shanetworkingInstance]; BOOL ok; NSError *setCategoryError = nil; ok = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; if (!ok) { NSLog(@"%s setCategoryError=%@", __PRETTY_FUNCTION__, setCategoryError); } self.viewController = [[MainViewController alloc] init]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } @end 

Además, como se menciona en los comentarios, debe vincular el AVFoundation Framework, como se explica en esta respuesta :

  • Abra su proyecto con xcode open ./platforms/ios/MyApp.xcworkspace/
  • Navegador de proyectos> destino Mi aplicación> General
  • Desplácese hasta el final para encontrar Frameworks y bibliotecas vinculadas

Yo trabajo en IOS7.

Es un trabajo con AVPlayer o AVAudioPlayer. Pero no funciona para mí con un video html5 en una UIWebView.

Todo mi código está aquí.

  • Puede pegar el código en la AppDelegate de una nueva aplicación ios vacía.
  • Agregar AVFoundation Framework
  • Habilitar audio de background
  • No funciona, aparece en el centro de control, pero la música se detiene cuando la aplicación entra en background.

     #import "AppDelegate.h" #import <AVFoundation/AVFoundation.h> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. AVAudioSession *audioSession = [AVAudioSession shanetworkingInstance]; BOOL ok; NSError *setCategoryError = nil; ok = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; if (!ok) { NSLog(@"%s setCategoryError=%@", __PRETTY_FUNCTION__, setCategoryError); } UIViewController *vc = [[UIViewController alloc] init]; UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController: vc]; self.window.rootViewController = nav; //WEBVIEW UIWebView *myWeb = [[UIWebView alloc] initWithFrame:CGRectMake(0, 200, 320, vc.view.frame.size.height)]; myWeb.mediaPlaybackRequiresUserAction = NO; myWeb.allowsInlineMediaPlayback = YES; [vc.view addSubview:myWeb]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.romito.fr/public/inlineHTML5/"]]; [myWeb loadRequest: request]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } 

¡La respuesta de Chris Lundie arriba es excelente! Puse su bloque de código dentro de AppDelegate de mi proyecto y funcionó.

Una palabra de precaución: 1) Asegúrese de agregar el framework AVFoundation a su proyecto

Este complemento hará que su aplicación ignore el interruptor de silencio. Básicamente es el mismo código que está en las otras respuestas, pero está muy bien integrado en un complemento para que no tenga que realizar ningún cambio manual objective.

https://github.com/EddyVerbruggen/cordova-plugin-backgroundaudio

Ejecute este command para agregarlo a su proyecto:

 cordova plugin add https://github.com/EddyVerbruggen/cordova-plugin-backgroundaudio.git 

Sintaxis Swift:

en AppDelegate:

 import AVFoundation func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { do{ let audio = AVAudioSession.shanetworkingInstance() try audio.setCategory(AVAudioSessionCategoryPlayback) }catch let error as NSError{ print(error) } } 

Aquí, la versión de SWIFT 2.0 para configurar la categoría de la session de audio en 'reproducción' antes de crear UIWebView.

 do { try AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryPlayback) } catch let error as NSError { print(error) } do { try AVAudioSession.shanetworkingInstance().setActive(true) } catch let error as NSError { print(error) }