iOS设备中RTCPeerConnection.ontrack事件不触发问题排查
以下是导致你遇到问题的几个常见原因:
媒体权限获取时机错误
iOS Safari要求必须先获得用户的摄像头/麦克风权限,才能生成包含媒体描述的SDP。如果在调用createOffer之后才请求权限,或者权限请求不是由用户主动操作触发(比如页面加载自动请求),会被浏览器拦截,导致PeerConnection无法关联媒体设备,生成的SDP自然没有媒体部分。必须确保在createOffer之前,通过用户点击等交互触发getUserMedia,且成功获取到媒体流。媒体流未正确关联到PeerConnection
iOS WebRTC严格要求:只有当你把getUserMedia获取到的媒体轨通过addTrack方法添加到RTCPeerConnection之后,生成的Offer才会包含媒体描述。如果跳过这一步,或者在createOffer之后才添加轨,iOS端生成的SDP只会保留基础信息,不会带媒体协商内容。PeerConnection配置不完整
iOS对RTCPeerConnection的初始化配置有严格要求,必须指定有效的iceServers(哪怕是公共STUN服务器,比如stun:stun.l.google.com:19302)。如果配置中缺少iceServers,可能会导致WebRTC模块无法正常初始化媒体协商流程,进而生成不完整的SDP。wrtc库版本兼容性问题
你使用的wrtc库版本是M87,这个版本的WebRTC实现可能和iOS 15/16内置的WebRTC存在协议细节上的差异。比如某些SDP属性的编码方式、媒体协商的流程顺序,iOS端无法正确识别,导致生成的Offer不包含媒体描述。可以尝试升级wrtc库到更兼容的版本,或者调整SDP的生成参数。异步流程处理不当
getUserMedia和createOffer都是异步操作,如果没有用async/await或者Promise链式调用确保顺序,可能会出现createOffer先执行、而媒体流还没准备好的情况。此时iOS端的PeerConnection还没有绑定任何媒体资源,生成的SDP自然缺失媒体描述。
内容的提问来源于stack exchange,提问作者Krishnan KK

