在网络重新连接时,我们尝试使用参数创建商品:
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];
例如,当您在同一个InvalidStateError: kHaveLocalOffer
中设置本地SDP报价后设置远程SDP报价而不是回答时,可能会出现RTCPeerConnection
。
如下图所示,如果两个对等体的网络状况没有变化,WebRTC可以自动从disconnected
状态恢复。因此,只有当iceConnectionState
切换到failed
或者您确定您的设备已切换网络并获得不同的IP时,才应执行冰重启。
实现从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
}
};