You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RTCPeerConnection设置remoteDescription时抛出只读错误是什么原因?

问题根因

  1. 核心原因:你直接将MQTT通道反序列化得到的普通JSON对象传入setRemoteDescription方法,未转换为react-native-webrtc要求的RTCSessionDescription实例,库内部赋值逻辑操作普通对象时触发只读属性限制,引发报错。
  2. 次要原因:你的代码使用了WebRTC规范早已废弃的mandatory配置项,且属性名大小写不符合现行标准,存在触发未知异常的风险。

解决步骤

1. 修改offer处理逻辑

引入RTCSessionDescription构造器,将收到的普通对象包装为标准实例后再传入setRemoteDescription,同时更新answer生成配置为规范写法:

import { RTCSessionDescription } from 'react-native-webrtc';

const handleOffer = offer => {
    const remoteOffer = new RTCSessionDescription(offer);
    peerConn.setRemoteDescription(remoteOffer)
        .then(() => {
            return peerConn.createAnswer({
                offerToReceiveAudio: true,
                offerToReceiveVideo: true,
            });
        })
        .then(answer => {
            return peerConn.setLocalDescription(answer);
        })
        .then(() => {
            sendMqttMessage({
                type: 'answer',
                answer: answer,
            });
        })
        .catch(err => {
            console.error('处理offer失败: ', err);
        });
};

2. 修改offer生成逻辑

移除废弃的mandatory配置项,使用规范的小写属性名:

const handleCall = () => {
    setCallActive(true);
    peerConn.createOffer({
        offerToReceiveVideo: false,
        offerToReceiveAudio: false,
    })
    .then(offer => {
        return peerConn.setLocalDescription(offer);
    })
    .then(() => {
        sendMqttMessage({
            type: 'offer',
            offer: offer,
            name: userId,
        });
    })
    .catch(err => {
        console.error('生成offer失败: ', err);
    });
};

可选校验

如果修改后仍报错,检查MQTT消息的序列化/反序列化逻辑,确保最终传入handleOffer的对象仅包含type和sdp两个有效属性,无多余自定义字段。


内容的提问来源于stack exchange,提问作者mger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:15:02