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

React Native WebRTC Android端addIceCandidate崩溃问题求助

Android端WebRTC添加ICE候选崩溃(iOS正常)的解决方案与排查思路

问题根源

从你提供的Hermes崩溃日志可以明确:崩溃是**sdpMid字段为undefined导致的空指针异常**。Android端WebRTC底层的JniHelper.getStringBytes方法尝试对null值调用getBytes,引发崩溃;而iOS端的WebRTC实现对sdpMid的容错性更高,允许该字段为空或undefined,因此没有触发问题。

你的ICE候选对象中sdpMid: undefined,这是核心问题:

{"candidate": "candidate:1 1 UDP 2013266431 fe80::e446:fbff:fe30:d913 53393 typ host", "sdpMLineIndex": 0, "sdpMid": undefined}

解决方案

修复ICE候选对象的sdpMid字段,确保它不为undefined:

  • 若没有明确的媒体流ID,可以将其设置为空字符串"";
  • 若对应具体的媒体流(如音频/视频),设置为对应的mid值(比如"audio"、"video"或与sdpMLineIndex匹配的索引字符串,如"0")。

修改后的候选处理代码示例:

// 预处理ICE候选,避免sdpMid为undefined
const fixedCandidate = {
  ...candidate,
  sdpMid: candidate.sdpMid ?? "" // 用空字符串替代undefined
};

try {
  await peerConnection.addIceCandidate(fixedCandidate);
  console.log('added ice candidate');
} catch (err) {
  console.log('Failed to add remote ICE candidate', err);
}

进一步排查思路

  • 验证字段完整性:在添加候选前打印完整的候选对象,确认candidate、sdpMLineIndex、sdpMid三个核心字段的取值,排除信令传递过程中字段丢失或被篡改的可能。
  • 测试构造候选:手动构造符合规范的ICE候选(例如sdpMid: ""、sdpMLineIndex: 0),调用addIceCandidate验证是否仍会崩溃,确认问题是否完全由sdpMid导致。
  • 检查库版本:若使用的是React Native WebRTC这类封装库,查看版本是否存在Android端ICE候选处理的已知bug,尝试升级到最新稳定版。
  • 开启详细日志:在Android端开启WebRTC原生日志,获取更底层的ICE候选处理细节,排查是否存在其他隐藏问题(如候选格式解析错误)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:45:45