Javascript 如何在手机浏览器的非活动选项卡中保持WebRTC数据通道打开?

Javascript 如何在手机浏览器的非活动选项卡中保持WebRTC数据通道打开?,javascript,html,webrtc,mobile-website,Javascript,Html,Webrtc,Mobile Website,我正在制作一个使用WebRTC的web应用程序。它可以在桌面浏览器上正常工作。但是,在小型智能手机web浏览器上,会出现不需要的事件: 在移动web浏览器chrome for android和firefox for android上切换选项卡时,使用.createDataChannel创建的打开的webrtc数据频道将关闭。触发dataChannel.onclose事件处理程序。如何防止数据通道关闭?如果不可能,是否可以在不重新启动整个信令阶段的情况下重新打开数据通道 当浏览带有 我浏览了一下s

我正在制作一个使用WebRTC的web应用程序。它可以在桌面浏览器上正常工作。但是,在小型智能手机web浏览器上,会出现不需要的事件:

在移动web浏览器chrome for android和firefox for android上切换选项卡时,使用
.createDataChannel
创建的打开的webrtc数据频道将关闭。触发
dataChannel.onclose
事件处理程序。如何防止数据通道关闭?如果不可能,是否可以在不重新启动整个信令阶段的情况下重新打开数据通道

当浏览带有

我浏览了一下stackoverflow,注意到在非活动选项卡中还有一些东西被减少/减慢了,比如
requestTimeOut
setInterval


强制浏览器在后台保持打开状态是否需要任何自动设置。

强制浏览器在后台保持选项卡完全活动的一种方法是使用Web Audio API。实际上,任何播放声音的应用程序(如音乐播放器)都需要保持活动状态,这是有意义的但是,这是一种非标准的黑客行为,因此不是未来的证明。如果您碰巧找到其他方法,请分享您的知识。

根据webRTC的mozilla文档

处理频道状态更改

本地和远程对等方都使用一种方法来处理指示通道连接状态变化的事件

当本地对等方遇到打开或关闭事件时,将调用handleSendChannelStatusChange()方法:

function handleSendChannelStatusChange(event) {
if (sendChannel) {
  var state = sendChannel.readyState;

  if (state === "open") {
    messageInputBox.disabled = false;
    messageInputBox.focus();
    sendButton.disabled = false;
    disconnectButton.disabled = false;
    connectButton.disabled = true;
  } else {
    messageInputBox.disabled = true;
    sendButton.disabled = true;
    connectButton.disabled = false;
    disconnectButton.disabled = true;
  }
}
}

如果通道的状态已更改为“打开”,则表示我们已完成在两个对等点之间建立链接。通过启用要发送的消息的文本输入框、聚焦输入框以便用户可以立即开始键入、启用“发送”和“断开”按钮(现在它们可用)以及禁用“连接”按钮(因为连接打开时不需要)来相应地更新用户界面

如果状态更改为“关闭”,则会发生相反的操作:输入框和“发送”按钮被禁用,“连接”按钮被启用,以便用户可以打开一个新的连接(如果他们希望这样做),而“断开”按钮被禁用,因为它在没有连接的情况下不可用

因此,请尝试使用HandlerReceiveChannelStatusChange
另一方面,此示例远程对等忽略状态更改事件,但将事件记录到控制台除外:

function handleReceiveChannelStatusChange(event) {
      if (receiveChannel) {
               console.log("Receive channel's status has changed to " +
               receiveChannel.readyState);
   }
 }

handleReceiveChannelStatusChange()方法接收发生的事件作为输入参数;这将是一个RTCDataChannelEvent。

只是一个简单的猜测:尝试保存SDP和ICE候选,并再次执行信号阶段,但使用保存的数据而不是实际的信号。请看这里:您可以发布代码吗请在1小时内尝试获得500分!我已经知道了。在我的问题中,我说dataChannel.onclose事件处理程序被触发,这意味着我已经有了一个HandlerReceiveChannelStatusChange,它可以执行正确的操作。如何防止onclose事件发生?复制粘贴:),我想500太多了,我认为您可以捕获更改事件选项卡来防止。onclose。。阅读:我不是想抓住这个事件