UIWebView:当应用程序进入后台时,HTML5音频在iOS 6中暂停

时间:2012-07-23 15:50:24

标签: ios uiwebview ios6 avfoundation html5-audio

美好的一天,

我的应用是一款音乐播放应用。我使用Javascript控制<audio> - 标记。到目前为止没有任何问题,播放,暂停,下一个和上一个按钮正在工作。当我在iOS 5中待机时,音乐会继续播放,但自动下一首歌不起作用。当它不处于待机状态时,它可以工作。在iOS 6中,只需按下按钮,音乐就会淡出。

锁定屏幕上的播放/暂停按钮适用于iOS 5,但不适用于iOS 6。

4 个答案:

答案 0 :(得分:73)

从iOS 6开始,您必须在创建UIWebView之前将音频会话类别设置为“回放”。这就是你所要做的。没有必要使会话处于活动状态。

这也应该用于html视频,因为如果你没有配置会话,当铃声开关关闭时你的视频将被静音。

#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框架,如this answer中所述:

  • 使用xcode open ./platforms/ios/MyApp.xcworkspace/
  • 打开您的项目
  • 项目导航器&gt;目标我的应用程序&gt;一般
  • 滚动到底部查找“链接的框架和库”

答案 1 :(得分:1)

此插件会让您的应用忽略静音开关。它与其他答案中的代码基本相同,但它很好地包装在插件中,因此您无需进行任何手动目标编辑。

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

运行此命令将其添加到项目中:

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

答案 2 :(得分:1)

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)
  }
}

答案 3 :(得分:0)

这里是SWIFT 2.0版本,用于将音频会话类别设置为“播放”#39;在创建UIWebView之前。

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)  
}