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

22

我正在制作一个使用WebRTC的网络应用程序。它在桌面浏览器上运行得很好。但是,在小型智能手机Web浏览器上会出现意外事件:

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

这也会在使用<input type="file">浏览文件时发生。

我在Stackoverflow上浏览了一下,并注意到其他在非活动选项卡中被减缓/延迟的事物,例如requestTimeOutsetInterval

是否需要任何授权以强制其在后台保持打开状态。


3
只是一个猜测:尝试保存SDP和ICE候选者,并再次进行信令阶段,但使用保存的数据而不是实际信令。 - Kevin
请查看此处:https://www.webrtc-experiment.com/ - Jorge Olaf
你能发一下代码吗? - Pritish Vaidya
1小时尝试获得500分! - Walle Cyril
2个回答

3

强制浏览器即使在后台也保持标签完全激活的一种方法是使用Web Audio API。确实,任何播放声音的应用程序(例如音乐播放器)都需要保持活动状态,这是有意义的。但是,这是一种非标准化的技巧,因此不能保证未来的兼容性。如果您找到其他方法,请分享您的知识。


2
根据Mozilla WebRTC文档... 处理通道状态变更 我们的本地和远程对等方都使用单个方法来处理指示通道连接状态变更的事件。
当本地对等方遇到打开或关闭事件时,将调用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;
  }
}

如果通道的状态已经变为“打开”,那就意味着我们已经成功建立了两个对等方之间的链接。用户界面会相应地更新,启用文本输入框以发送消息,聚焦输入框以便用户可以立即开始输入,启用“发送”和“断开连接”按钮,因为它们现在是可用的,同时禁用“连接”按钮,因为当连接打开时不再需要它。

如果状态变为“关闭”,则发生相反的一组操作:输入框和“发送”按钮被禁用,启用“连接”按钮,以便用户可以打开新的连接(如果他们希望这样做),并禁用“断开连接”按钮,因为在没有连接时它是无用的。

因此,请尝试使用handleReceiveChannelStatusChange进行操作。
另一方面,这个示例远程对等方忽略状态更改事件,除了将事件记录到控制台中:

function handleReceiveChannelStatusChange(event) {
      if (receiveChannel) {
               console.log("Receive channel's status has changed to " +
               receiveChannel.readyState);
   }
 }
< p > handleReceiveChannelStatusChange()方法的输入参数是发生的事件;这将是一个RTCDataChannelEvent。


我已经知道了。在我的问题中,我说过 dataChannel.onclose 事件处理程序已被触发,这意味着我已经有一个正确处理事情的 handleReceiveChannelStatusChange 处理程序。那么我应该如何防止 onclose 事件的发生? - Walle Cyril
那个复制粘贴的操作,我猜500太多了。 - Walle Cyril
{btsdaf} - CristiC777
我并不想捕获这个事件。 - Walle Cyril

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接