CodenameOne WebRTC无服务器手动信令跨设备建联故障排查
WebRTC手动信令跨设备addIceCandidate失败排查方案
Failed to execute 'addIceCandidate' 报错本质是传入的ICE候选结构非法、候选与当前RTCPeerConnection实例的SDP协商状态不匹配,或跨环境候选格式不兼容,可按以下优先级排查:
- 先验证ICE候选、SDP导入导出的完整性
手动复制/文件导入过程中容易出现换行丢失、特殊字符转义异常、首尾多余空格的问题,逐字符对比设备A导出的信令串和设备B导入的信令串是否完全一致,注意SDP里的a=candidate行必须完整保留换行和空格,不能做任何截断修改。 - 检查ICE候选添加时序是否正确
必须严格遵守如下时序,跨设备延迟会放大时序错误,也是单设备正常、跨设备报错的高频原因:设备A创建Offer → 调用setLocalDescription(Offer) → 收集完所有ICE候选(或开启trickle ICE)→ 把Offer+ICE候选传给设备B
设备B接收到Offer后先执行setRemoteDescription(Offer) → 再添加设备A的ICE候选 → 生成Answer → 调用setLocalDescription(Answer) → 收集完ICE候选传给设备A
设备A接收到Answer后先执行setRemoteDescription(Answer) → 再添加设备B的ICE候选
只要在setRemoteDescription执行完成前调用addIceCandidate,就会触发当前报错。 - 排查跨环境网络适配问题
手机端和PC模拟器的网络环境存在NAT隔离,单设备场景用的是主机候选(host candidate)不需要穿透,跨设备必须配置公网STUN/TURN服务器:- 检查RTCPeerConnection初始化的配置项,确认手机端和PC端的iceServers配置完全一致,没有遗漏公网STUN地址
- 关闭两端的VPN、代理软件,避免网络路径异常导致ICE候选不可用
- 新增容错代码兼容异常候选
给addIceCandidate调用加异常捕获,非法候选直接跳过不影响其他候选的处理,参考代码:// 安卓端WebRTC封装调用示例 try { peerConnection.addIceCandidate(iceCandidate); } catch (RuntimeException e) { Log.w("WebRTC", "无效ICE候选,已跳过", e); }
内容的提问来源于stack exchange,提问作者Chief O
相关产品推荐
相关产品推荐

