设置 AVAudioSession 类别对来自 WKWebView 的声音没有影响

Posted

技术标签:

【中文标题】设置 AVAudioSession 类别对来自 WKWebView 的声音没有影响【英文标题】:Setting AVAudioSession Category has no effect on sound from WKWebView 【发布时间】:2014-11-26 14:54:53 【问题描述】:

当从 WKWebView 播放音频时,我似乎无法覆盖 AVAudiosession 类别或端口。使用普通 UIWebView 时,相同的代码可以完美运行。

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];

我也尝试过像这样激活sharedInstance,但没有帮助:

[session setActive: YES error: nil];

以上代码对来自 WKWebView 的音频没有影响。我确实在 Twitter 上发现了一些关于 iOS 8.1 正在将 WKWebView 音频与后台应用程序音频混合的报道,但我找不到它的来源。请参阅此推特线程以供参考:https://twitter.com/marcoarment/status/530881842900373504

【问题讨论】:

您希望应用继续在后台播放网络音频吗? 不,我想将音频从扬声器切换到听筒再播放。 嗨@LylePratt,尝试检查-setActive:error: 中可能出现的错误,如果发生错误,则将指针设置为描述错误的NSError 对象。是否有其他音频对象(例如队列、转换器、播放器或录音机)当前正在运行? 您有没有找到满意的解决方案? 您好,您找到解决方案了吗? 【参考方案1】:

显然 WKWebView 在与您的应用程序不同的进程中运行。这可能意味着,它也有自己的 AudioSession 与您的应用程序的 AudioSession 分开。这就是为什么更改应用程序的 AudioSession 不会影响 webView。以及为什么它与 UIWebView 一起工作(没有单独的过程)。至少到目前为止我收集到的就是这些……

我的解决方案是让我的应用的 AudioSession 与其他应用混合:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord 
                                 withOptions:AVAudioSessionCategoryOptionMixWithOthers
                                       error:&error];

当然,这也有其他含义。您的应用的音频将与所有其他应用的音频混合,而不仅仅是您的网络视图。

【讨论】:

嗨,我正在尝试从 wkwebview 播放 js 声音,它不应该停止播放背景音乐。但我无法让它工作,知道吗? 这对我不起作用。在 WKWebView 中播放会强制中断您应用中的音频并拒绝混合。

以上是关于设置 AVAudioSession 类别对来自 WKWebView 的声音没有影响的主要内容,如果未能解决你的问题,请参考以下文章

禁用 AVAudioSession 后 Unity 声音不起作用

AVAudioSession 类别变为 nil 并且 mediaServicesWereReset,avplayer 播放一直失败

如何取消 AVAudioSession

使用 AVAudioSession 时背景音频安静

iOS- 关于AVAudioSession的使用——后台播放音乐

AVAudioSession - 捕获 setMode 和 setCategory 错误