опция iceRestart в createOffer - PullRequest
       68

опция iceRestart в createOffer

0 голосов
/ 18 апреля 2019

При переподключении сети мы пытаемся создать предложение с параметром:

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 Ответ

1 голос
/ 18 апреля 2019

InvalidStateError: kHaveLocalOffer может произойти, например, когда вы устанавливаете удаленное предложение SDP вместо ответа после установки локального предложения SDP в том же RTCPeerConnection.

Как показано на диаграмме ниже, WebRTC может автоматически восстанавливаться изdisconnected указать, не изменились ли условия сети обоих узлов.Таким образом, вы должны выполнить перезапуск на льду, только если iceConnectionState переключен на failed или если вы уверены, что ваше устройство переключило сеть и получило другой IP.

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
      }
};
...