2017-03-15 105 views
-3

为了支持ICE与任意客户端的trickling,建议信令机制也支持信号的涓流支持。我这么做;一个对等体可以在初始信令握手中包含一个标志,它是否支持trickling,所以远程对等体可以决定涓流。检测本地浏览器是否支持ICE涓流

我遇到的问题是我不知道如何检测当前浏览器是否支持ICE trickling,因此它可以正确设置该标志。我试图用这个作为一个检测机制:

typeof RTCPeerConnection.prototype.addIceCandidate == 'function' 

这是可靠的,有最好的,或者是有一个更好的API或方法来查询对ICE-涓涓本地支持?

+0

所有支持的WebRTC支持流下的浏览器。 – jib

+0

这似乎与我们测试过的所有相关浏览器都是一样的。然而,在过去的某个时候,似乎并非如此。关于滴漏的大多数信息都是相当过时的,并且来自有争议的时间段。它可以保证浏览器支持它的任何地方;或者再次,有些方法来检测支持? – deceze

回答

2

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

JSEP section 5.2.1说:

一个与所述 “滴” 选项 “A =冰选项” 行必须被添加,如[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属性,你可以使用,如果检测远程对等支持trickling,可能是为了支持连接传统系统。下面(在Chrome中,需要追上来规范undefined)产生在Firefox true

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");

+0

好吧,这简化了情况...... :) – deceze

相关问题