RTCPeerConnection: restartIce() 方法

Baseline 已广泛支持

此特性已得到良好支持,可在多种设备和浏览器版本上使用。自 2021 年 4 月起,所有浏览器均已支持此特性。

restartIce() 方法是 RTCPeerConnection 接口的一个方法,它允许 Web 应用程序请求在连接的两端都重新进行 ICE 候选收集。这通过允许调用方或接收方使用相同的方法来触发 ICE 重启,从而简化了该过程。

调用 restartIce() 后,下一次调用 createOffer() 返回的 offer 会自动配置为触发本地对等端(一旦设置了本地对等端)和远程对等端(一旦 offer 通过您的信令机制发送并远程对等端设置了其描述)的 ICE 重启。

restartIce() 会在 RTCPeerConnection 上触发 negotiationneeded 事件,以通知应用程序它应该通过其信令通道执行协商。

如果协商未能完成——无论是由于回滚还是因为正在处理传入的 offer——RTCPeerConnection 会记住您请求了 ICE 重启。下次当连接的 signalingState 变为 stable 时,连接将触发 negotiationneeded 事件。此过程将一直持续,直到 ICE 重启成功完成。

语法

js
restartIce()

参数

无。

返回值

无(undefined)。

用法说明

调用 restartIce() 后,使用 createOffer() 创建的下一个 offer 在通过您的信令机制发送到远程对等端后,将启动 ICE 重启。ICE 重启本质上会重置 ICE,使其使用新的凭据创建所有新的候选。在此过程中,现有的媒体传输将继续不间断。

有关 ICE 重启工作原理的详细信息,请参阅 ICE restartRFC 5245, section 9.1.1.1: ICE specification

示例

此示例创建了一个 iceconnectionstatechange 事件的处理器,该处理器通过重启 ICE 来处理向 failed 状态的过渡,以重试连接。

js
pc.addEventListener("iceconnectionstatechange", (event) => {
  if (pc.iceConnectionState === "failed") {
    /* possibly reconfigure the connection in some way here */
    /* then request ICE restart */
    pc.restartIce();
  }
});

有了这段代码,ICE 协商期间向 failed 状态的过渡将触发一个 negotiationneeded 事件,您的代码应响应此事件进行正常重新协商。但是,由于您调用了 restartIce(),您在 negotiationneeded 的处理器中调用的 createOffer() 将会触发 ICE 重启,而不仅仅是常规的重新协商。

规范

规范
WebRTC:浏览器中的实时通信
# dom-rtcpeerconnection-restartice

浏览器兼容性

另见