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

React Native WebRTC二次启动会议报错:Remote Description为Null及崩溃问题

解决方案

一、彻底清理会议资源(解决二次启动警告)

结束会议时必须销毁所有WebRTC相关实例,不能仅做UI层面的隐藏:

  • 停止本地媒体流:遍历所有本地track,调用track.stop()后从MediaStream移除
  • 关闭PeerConnection:调用peerConnection.close(),并将引用置为null
  • 清理信令监听:移除Firebase实时数据库的监听(如onValue、onChildAdded),避免旧回调触发
  • 重置状态变量:会议状态、远端SDP、ICE候选等变量恢复初始值

示例代码片段:

const endMeeting = async () => {
  // 停止本地媒体流
  if (localStream) {
    localStream.getTracks().forEach(track => track.stop());
    localStream = null;
  }
  // 关闭PeerConnection
  if (peerConnection) {
    peerConnection.close();
    peerConnection = null;
  }
  // 移除Firebase信令监听
  if (signalListener) {
    signalListener(); // 执行监听返回的取消函数
    signalListener = null;
  }
  // 重置状态
  setIsInMeeting(false);
  setRemoteSdp(null);
  setIceCandidates([]);
};

二、修复PeerConnectionObserver空指针(解决崩溃问题)

该异常是因为调用了已销毁或未初始化的PeerConnectionObserver实例方法,需确保:

  • 初始化PeerConnection时,正确创建并关联PeerConnectionObserver,仅在PeerConnection存活时使用该实例
  • PeerConnection关闭后,立即将Observer引用置为null,避免后续代码误调用
  • 信令逻辑中,处理远端SDP或ICE候选前,先检查PeerConnection和Observer是否存在

示例代码片段:

// 创建PeerConnection时绑定Observer
PeerConnectionObserver observer = new PeerConnectionObserver() {
  // 实现回调方法...
};
peerConnection = factory.createPeerConnection(configuration, observer);

// 结束会议时清理资源
peerConnection.close();
peerConnection = null;
observer = null;

若在JavaScript层调用,需确保每次创建新PeerConnection时重新生成Observer,销毁时清理引用,禁止复用旧实例。

三、信令逻辑健壮性优化

  • 处理远端SDP前先判空,再调用setRemoteDescription:
const handleRemoteSdp = async (sdp) => {
  if (!sdp || !peerConnection) return;
  try {
    await peerConnection.setRemoteDescription(new RTCSessionDescription(sdp));
    // 后续逻辑...
  } catch (err) {
    console.error('Set remote description failed:', err);
  }
};
  • 加入会议时,确保本地PeerConnection和媒体流完全初始化后,再发送本地SDP到信令服务器
  • 处理ICE候选时,先检查PeerConnection是否存在,再执行添加操作

四、Expo 49特定注意事项

  • 确保expo-webrtc版本与Expo 49匹配,建议锁定版本至^12.4.0(Expo 49对应稳定版)
  • 不在根组件中持有WebRTC实例,尽量在页面级组件中管理,组件卸载时执行清理
  • 使用useEffect钩子在组件卸载时自动清理资源:
useEffect(() => {
  return () => {
    // 组件卸载时执行会议清理
    endMeeting();
  };
}, []);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:37:18