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

Posted

技术标签:

【中文标题】UIWebView:当应用程序进入后台时,iOS 6 中的 HTML5 音频暂停【英文标题】:UIWebView: HTML5 audio pauses in iOS 6 when app enters background 【发布时间】:2012-07-21 21:26:53 【问题描述】:

早安,

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

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

【问题讨论】:

也许等着看他们是否会在以后的版本中修复它? 也许这是一个特性,而不是一个错误? 【参考方案1】:

从 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

另外,如 cmets 中所述,您需要链接 AVFoundation 框架,如 this answer 中所述:

用 xcode open ./platforms/ios/MyApp.xcworkspace/ 打开你的项目 项目导航器 > 目标我的应用程序 > 常规 滚动到底部以查找链接框架和库

【讨论】:

哇,这似乎与我遇到的类似问题有关。你在哪里发现的?是否有关于 iOS6 中 UIWebView / AVAudioSession 发生了什么变化的文档? iOS 6 发行说明中说 UIWebView 不再设置音频播放会话,所以必须自己做。该注释可能仅在 GM 版本中添加。至少,我在测试期间遇到了这个问题,但直到 GM 才找到解决方法。 我从来没有做过任何 Objective-C 并且不知道我应该如何处理这段代码 sn-p,你能给我解释一下吗? @heysamhey 这段代码可以放在 ViewController.m 中。 import 语句应该放在顶部,其余的可以放在viewDidLoad 中。要链接 AVFoundation 框架,请检查 this answer on SO。 @ChrisLundie 也许您应该添加音频背景模式也需要在 XCode 功能选项卡中启用。只是为了完整起见:-)【参考方案2】:

此插件将使您的应用忽略静音开关。它基本上与其他答案中的代码相同,但它被很好地包装在一个插件中,因此您不必进行任何手动目标 c 编辑。

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

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

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

【讨论】:

【参考方案3】:

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)
  

【讨论】:

【参考方案4】:

这里是 SWIFT 2.0 版本,用于在创建 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)  

【讨论】:

内嵌视频有没有这样的方法,可以在应用进入后台时播放音频。目前,当应用程序进入后台时,音频停止播放。不过,我可以随时打开控制中心继续玩。

以上是关于UIWebView:当应用程序进入后台时,iOS 6 中的 HTML5 音频暂停的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序进入和退出后台时更新ios中的计时器

当 iOS 应用程序进入后台时,是不是会暂停冗长的任务?

在 iOS 上,当应用程序进入后台时 UnityWebRequest 下载停止

当 iOS 应用程序确实进入后台时,TCP 和 UDP(使用多播)连接会发生啥情况

如何使用 HTML 和 JavaScript 检测 iOS 应用何时进入后台

我的 phonegap 应用程序的 iOS 插件工作过一次。当应用程序再次启动时,它不起作用,直到我进入后台并返回应用程序