createOffer中的iceRestart选项

时间:2019-04-18 15:37:50

标签: webrtc openwebrtc

在网络重新连接上,我们正在尝试创建带有以下参数的商品:

iceRestart : true

但是,在接收方用户处抛出错误:

  

InvalidStateError:无法设置远程商品sdp:处于错误状态:kHaveLocalOffer。

基本上,它尝试创建新商品而不是重新启动现有连接。在createOffer方法中实现iceRestart的正确方法是什么?

self.constraints = [[RTCMediaConstraints alloc] 
initWithMandatoryConstraints:
@[
[[RTCPair alloc] initWithKey:@"OfferToReceiveAudio" 
value:@"true"],
[[RTCPair alloc] initWithKey:@"OfferToReceiveVideo" 
 value:@"true"],
[[RTCPair alloc] initWithKey:@"iceRestart" value:@"true"]
] optionalConstraints:nil];
[_peerConnection createOfferWithDelegate:self 
constraints:self.constraints];

1 个答案:

答案 0 :(得分:1)

InvalidStateError: kHaveLocalOffer例如,当您在同一RTCPeerConnection中设置本地SDP报价后设置远程SDP报价而不是应答时,可能会发生。

如下图所示,如果两个对等方的网络条件均未更改,则WebRTC可以自动从disconnected状态恢复。因此,只有在iceConnectionState切换为failed或确定设备已切换网络并获得其他IP的情况下,才应执行Ice ice重新启动。

enter image description here

failed状态实现重新连接的最简单方法是,定义只有一个对等方将执行iceRestart服务,例如,发起连接的一方。

一些javascript伪代码:

this.rtcPeerConnection.oniceconnectionstatechange = () => {
      if (this.rtcPeerConnection.iceConnectionState === 'failed' && this.isConnectionInitializer) {
          // createOffer({iceRestart: true})
          // set offer as local description
          // send offer to peer
      }
};