检测本地浏览器是否支持ICE滴流

时间:2017-03-15 15:28:13

标签: javascript google-chrome firefox webrtc

为了支持ICE-trickling与任意客户端,建议信令机制也支持信号提供涓流支持。我这样做;对等体可以包含一个标志,它是否支持初始信令握手中的滴流,因此远程对等体可以决定滴流。

我遇到的问题是,我不确定如何检测当前浏览器是否支持ICE-trickling,因此可以正确设置该标志。我试图将其用作检测机制:

typeof RTCPeerConnection.prototype.addIceCandidate == 'function'

这是可靠且最好的,还是有更好的API或方法来查询本地支持ICE-trickling?

1 个答案:

答案 0 :(得分:2)

所有现代WebRTC端点必须支持Trickle ICE。

JSEP section 5.2.1说:

  

必须添加带有“涓流”选项的“a = ice-options”行,如[I-D.ietf-ice-trickle]第4节中所述。

此外,在我阅读WebRTC规范时,如果浏览器为conformant,则必须实施addIceCandidate等。

今天支持WebRTC的所有浏览器都支持滴流。以下内容在Firefox中返回true(Chrome似乎没有正确发出信号,但请放心支持滴流):

new RTCPeerConnection().createOffer({offerToReceiveAudio: true})
.then(offer => console.log(offer.sdp.includes('\r\na=ice-options:trickle')))
.catch(e => log(e));

有趣的是,您可以使用pc.canTrickleIceCandidates属性来检测远程对等体是否支持滴流,可能是为了支持连接到旧系统。以下内容在Firefox中生成true(Chrome中的undefined,需要了解规范):

var pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection();

pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);

pc1.onnegotiationneeded = e =>
  pc1.createOffer().then(d => pc1.setLocalDescription(d))
  .then(() => pc2.setRemoteDescription(pc1.localDescription))
  .then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(d))
  .then(() => pc1.setRemoteDescription(pc2.localDescription))
  .then(() => console.log(pc1.canTrickleIceCandidates))
  .catch(e => console.log(e));

pc1.createDataChannel("dummy");