UIWebView:当应用程序进入后台时,HTML5audio会在iOS 6中暂停

美好的一天,

我的应用是一个音乐播放应用。 我用Javascript控制<audio> -Tag。 到目前为止没有问题,播放,暂停,下一个和上一个button正在工作。 当我待机iOS 5中的设备时,音乐继续播放,但自动下一首歌曲不起作用。 当它不在待机状态时,它可以工作。 而在iOS 6中,按下button后,音乐淡出。

locking屏幕上的播放/暂停button在iOS 5中运行,但不在iOS 6中运行。

从iOS 6开始,您必须在创buildUIWebView之前将audio会话类别设置为“回放”。 这是你所要做的。 没有必要使会话激活。

这也应该用于htmlvideo,因为如果您没有configuration会话,当振铃开关closures时,您的video将被静音。

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

确保您的目标链接到AVFoundation框架。


如果使用Cordova,则需要修改的文件是platforms/ios/MyApp/Classes/AppDelegate.m ,最终会看起来像这样:

 #import "AppDelegate.h" #import "MainViewController.h" #import <AVFoundation/AVFoundation.h> @implementation AppDelegate - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 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 

另外,正如在评论中提到的,你需要链接AVFoundation框架,正如在这个答案中所解释的:

  • 打开您的项目与Xcode open ./platforms/ios/MyApp.xcworkspace/
  • 项目导航>目标我的应用程序>一般
  • 滚动到底部以查找链接的框架和库

我在IOS7上工作。

它与AVPlayer或AVAudioPlayer一起工作。 但是在UIWebView中使用html5video并不适合我。

我所有的代码都在这里。

  • 您可以将代码粘贴到新的空白ios应用程序的AppDelegate中
  • 添加AVFoundation框架
  • 启用背景audio
  • 我不工作,它出现在控制中心,但是当应用程序在背景中input时,音乐暂停!

     #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 sharedInstance]; 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; } 

上面的Chris Lundie的回答非常好! 我已经把他的代码块在我的项目的AppDelegate内,它的工作。

请注意:1)确保将AVFoundation框架添加到您的项目中

这个插件会让你的应用程序忽略静音开关。 它基本上和其他答案中的代码相同,但它很好地包装到插件中,因此不必进行任何手动目标编辑。

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

运行这个命令将它添加到你的项目中:

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

Swift语法:

在AppDelegate中:

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

这里SWIFT 2.0版本在创buildUIWebView之前将audio会话类别设置为“回放”。

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