iOS 16(Safari)中SIP.js的WEBRTC音频功能异常求助
媒体权限静默失败:iOS 16 Safari对媒体权限管控更严格,非HTTPS环境(localhost除外)会直接拒绝权限但不输出日志;若用户曾拒绝过权限,后续请求也会静默失败,不会弹出授权框。可主动检查权限状态:
navigator.permissions.query({ name: 'microphone' }).then(status => { console.log('Mic permission status:', status.state); });SDP兼容性差异:iOS 16 Safari生成的SDP在编码优先级、ICE候选格式上和Chrome/Android存在差异,部分SIP服务器或旧版SIP.js未适配这类差异。比如iOS默认优先携带H.264编码(即便仅需音频),可能导致SDP解析异常。可强制指定音频编码:
const mediaConstraints = { audio: { echoCancellation: true, mandatory: { codecs: ['PCMU', 'PCMA'] } } };ICE连接超时设置:iOS 16 Safari的ICE候选收集速度偏慢,若SIP.js的ICE超时阈值设置过短,会导致连接建立失败。建议延长ICE候选等待时间,或监听
icecandidate事件,确认候选收集完成后再发送SDP。后台媒体限制:iOS 16 Safari在后台会暂停WEBRTC媒体流,若呼叫发起时页面处于后台(比如用户切换APP),会直接导致音频收发失效。需确保发起呼叫时页面处于前台,同时提醒用户呼叫过程中不要切换后台。
SIP.js版本适配:旧版本SIP.js可能未适配iOS 16的WEBRTC API变动,比如
RTCPeerConnection部分方法参数调整。建议升级到最新稳定版SIP.js,同时排查官方issue是否有同类兼容问题记录。音频路由异常:iOS 16 Safari默认音频路由可能出现识别错误,导致无声音输出。可尝试手动指定音频输出设备:
navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => { const audioTrack = stream.getAudioTracks()[0]; audioTrack.setSinkId('speaker'); // 需根据设备实际sinkId调整 });
另外,可开启Safari的WebRTC调试日志:开发者菜单中选择WebRTC -> Enable WebRTC Logging,重新发起呼叫后查看详细日志,大概率能找到静默失败的根源。
内容的提问来源于stack exchange,提问作者ap0210

