在网络重新连接上,我们正在尝试创建带有以下参数的商品:
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];
答案 0 :(得分:1)
InvalidStateError: kHaveLocalOffer
例如,当您在同一RTCPeerConnection
中设置本地SDP报价后设置远程SDP报价而不是应答时,可能会发生。
如下图所示,如果两个对等方的网络条件均未更改,则WebRTC可以自动从disconnected
状态恢复。因此,只有在iceConnectionState
切换为failed
或确定设备已切换网络并获得其他IP的情况下,才应执行Ice ice重新启动。
从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
}
};