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 中所述:
用 xcodeopen ./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 上,当应用程序进入后台时 UnityWebRequest 下载停止
当 iOS 应用程序确实进入后台时,TCP 和 UDP(使用多播)连接会发生啥情况
如何使用 HTML 和 JavaScript 检测 iOS 应用何时进入后台
我的 phonegap 应用程序的 iOS 插件工作过一次。当应用程序再次启动时,它不起作用,直到我进入后台并返回应用程序