RTCPeerConnection: setConfiguration() 方法

Baseline 已广泛支持

此功能已经非常成熟,可在多种设备和浏览器版本上使用。自 2022 年 4 月以来,它已在各大浏览器中得到支持。

RTCPeerConnection 接口的 setConfiguration() 方法根据指定对象中包含的值来设置连接的当前配置。这允许您更改连接使用的 ICE 服务器以及使用的传输策略。

此方法最常见的用例(即使如此,也可能不是一个非常常见的用例)是替换要使用的 ICE 服务器集。可能执行此操作的两个潜在场景是:

  • RTCPeerConnection 在未指定任何 ICE 服务器的情况下被实例化。例如,如果未使用任何参数调用 RTCPeerConnection() 构造函数,则必须在 ICE 协商开始之前调用 setConfiguration() 来添加 ICE 服务器。
  • 需要重新协商连接,并且出于某种原因需要使用不同的 ICE 服务器集。例如,用户可能已移至新区域,因此需要使用新的区域 ICE 服务器。在这种情况下,可以调用 setConfiguration() 来切换到新的区域 ICE 服务器,然后启动 ICE 重启

注意: 一旦设置了连接的身份信息,就无法更改它。

语法

js
setConfiguration(configuration)

参数

configuration

提供要设置的选项的对象。更改不是累加的;而是,新值会完全替换现有值。有关允许的选项的信息,请参阅 RTCPeerConnection()

返回值

无(undefined)。

异常

InvalidAccessError DOMException

如果在 configuration.iceServers 中指定的 URL 中有一个或多个是 TURN 服务器,但未提供完整的登录信息(即,缺少 usernamecredential,或者如果 credentialType"password"credential 不是字符串),则会抛出此错误。这会阻止成功登录服务器。

InvalidModificationError DOMException

如果 configuration 包含已更改的身份信息,但连接已指定身份信息,则会抛出此错误。如果设置了 configuration.peerIdentityconfiguration.certificates 并且它们的值与当前配置不同,则会发生这种情况。如果更改了 configuration.bundlePolicyconfiguration.rtcpMuxPolicy,或者更改了 configuration.iceCandidatePoolSize(并且 RTCPeerConnection.setLocalDescription() 已被调用),也可能抛出此错误。

InvalidStateError DOMException

如果 RTCPeerConnection 已关闭,则抛出此异常。

SyntaxError DOMException

如果 configuration.iceServers 不包含任何 URL,或者列表中的某个值无效,则会抛出此错误。

NotSupportedError DOMException

如果 configuration.iceServers 包含的 URL 的方案不受支持,则会抛出此错误。

示例

在此示例中,已确定需要 ICE 重启,并且需要使用不同的 ICE 服务器进行协商。

js
const restartConfig = {
  iceServers: [
    {
      urls: "turn:asia.turn-server.net",
      username: "allie@oopcode.com",
      credential: "topsecretpassword",
    },
  ],
};

myPeerConnection.setConfiguration(restartConfig);

myPeerConnection.restartIce();

myPeerConnection
  .createOffer() // restartIce() causes iceRestart to be set true
  .then((offer) => myPeerConnection.setLocalDescription(offer))
  .then(() => {
    // send the offer to the other peer using the signaling server
  })
  .catch(window.reportError);

首先,创建一个新对象 restartConfig,指定新的 ICE 服务器及其凭据。然后将其传递给 setConfiguration()。通过调用 restartIce() 来重启 ICE 协商,这会导致创建的下一个 offer 包含新的 ICE 服务器信息。从那里,我们按常规处理流程,将本地描述设置为返回的 offer,然后将该 offer 发送给另一方。

规范

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

浏览器兼容性

另见