#webrtc #openwebrtc
#webrtc #openwebrtc
Вопрос:
При повторном подключении к сети мы пытаемся создать предложение с параметром:
iceRestart : true
Но у пользователя-получателя он выдает ошибку:
Ошибка InvalidStateError: не удалось установить sdp удаленного предложения: вызывается в неправильном состоянии: kHaveLocalOffer.
По сути, он пытается создать новое предложение вместо перезапуска существующего соединения. Как правильно реализовать iceRestart в методе createOffer?
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:
InvalidStateError: kHaveLocalOffer
может возникнуть, например, когда вы устанавливаете предложение удаленного SDP вместо ответа после установки локального предложения SDP в том же RTCPeerConnection
.
Как показано на диаграмме ниже, WebRTC может автоматически восстанавливаться из disconnected
состояния, если сетевые условия обоих одноранговых узлов не изменились. Таким образом, вы должны выполнять перезапуск ice, только если iceConnectionState
вы переключились на failed
или если вы уверены, что ваше устройство переключило сеть и получило другой IP.
Самый простой способ реализовать переподключения из failed
состояния — определить, что предложение iceRestart будет выполнять только один одноранговый узел, например, тот, кто инициировал соединение.
Некоторый псевдокод javascript:
this.rtcPeerConnection.oniceconnectionstatechange = () => {
if (this.rtcPeerConnection.iceConnectionState === 'failed' amp;amp; this.isConnectionInitializer) {
// createOffer({iceRestart: true})
// set offer as local description
// send offer to peer
}
};