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

React Native Android WebRTC语音聊天LTE转WiFi连接失败求助

React Native Android WebRTC实时语音聊天跨网络连接问题求助

我在React Native Android中实现WebRTC实时语音聊天功能,最初使用coturn搭建TURN服务器,因怀疑配置有误更换为付费的ExpressTURN服务器后,WebRTC仅能在本地环境正常通信;仅使用coturn时,LTE转WiFi场景可正常通信。

通信基于HTTPS协议,但使用的是自签名根证书,且未部署到TURN服务器上,目前无法定位问题原因,恳请有相关经验的开发者协助排查解决。

连接测试结果

  • wifi(私有网络) -> wifi(私有网络) = success
  • lte -> lte = success
  • wifi(私有网络) -> lte = success
  • lte -> wifi(私有网络) = failure
  • wifi(热点) -> lte = success
  • lte -> wifi(热点) = failure

核心代码

async initialize() {
  try {
    await this.initializeData()
    
    this.peerConnection = new RTCPeerConnection({
      iceServers: [
        // { urls: 'stun:stun.l.google.com:19302' },
        {
          urls: [
            "turn:??",
            "turn:??",
            "turn:??",
            "turn:??",
            "turn:??",
          ],
          username: '??',
          credential: '??',
        }
      ]
    })

    this.localStream = await mediaDevices.getUserMedia({ audio: true, video: false })
    this.localStream.getTracks().forEach(track => this.peerConnection.addTrack(track, this.localStream))

    // 对等连接事件
    this.peerConnection.addEventListener('track', this.onTrackEvent)
    this.peerConnection.addEventListener('icecandidate', this.onIcecandidateEvent)

    this.peerConnection.addEventListener('connectionstatechange', (event) => {
      console.log(`connectionState`, this.peerConnection?.connectionState)
    })
    this.peerConnection.addEventListener('iceconnectionstatechange', (event) => {
      console.log(`iceConnectionState`, this.peerConnection?.iceConnectionState)
    })
    this.peerConnection.addEventListener('signalingstatechange', () => {
      console.log(`signalingState`, this.peerConnection?.signalingState)
    })
  } catch (error) {
    console.error(error)
  }
}

onTrackEvent = (event) => {
  try {
    this.remoteStream = event.streams[0]
  } catch (error) {
    console.error(error)
  }
}

onIcecandidateEvent = (event) => {
  try {
    if (event.candidate) {
      socketManager.socket?.emit('WebRTC_ICEcandidate', { target: id, candidate: event.candidate })
    }
  } catch (error) {
    console.error(error)
  }
}

onIcecandidateEvent = (event) => {
  try {
    if (event.candidate) {
      socketManager.socket?.emit('WebRTC_ICEcandidate', { target: id, candidate: event.candidate })
    }
  } catch (error) {
    console.error(error)
  }
}

async startOffer() {
  try {
    const offer = await this.peerConnection?.createOffer()
    await this.peerConnection?.setLocalDescription(offer)

    socket?.emit('WebRTC_startOffer', { target: id, offer: offer })
  } catch (error) {
    console.error(error)
  }
}

async answerOffer({ offer }) {
  try {
    await this.peerConnection?.setRemoteDescription(offer)

    const answer = await this.peerConnection?.createAnswer()
    await this.peerConnection?.setLocalDescription(answer)

    socket?.emit('WebRTC_answerOffer', { target: id, answer: answer })
  } catch (error) {
    console.error(error)
  }
}

async setRemoteOffer({ answer }) {
  try {
    await this.peerConnection?.setRemoteDescription(answer)
  } catch (error) {
    console.error(error)
  }
}

async setRemoteIceCandidate({ iceCandidate }) {
  try {
    if (this.peerConnection) {
      this.peerConnection?.addIceCandidate(new RTCIceCandidate(iceCandidate))
    }
  } catch (error) {
    console.error(error)
  }
}

内容的提问来源于stack exchange,提问作者이영준

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:20:14