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

Flutter WebRTC:getUserMedia在Safari及iOS设备无法正常工作

Flutter Web: getUserMedia在苹果Safari/iOS Chrome失效的解决方案

1. 强制使用HTTPS环境

苹果要求所有媒体设备访问必须在HTTPS环境下(仅localhost开发环境例外)。HTTP部署会直接被浏览器拦截权限请求,导致应用卡顿:

  • 开发阶段:使用flutter run -d chrome --web-port=8080 --web-hostname=0.0.0.0启动,通过localhost访问
  • 生产环境:配置HTTPS证书,确保域名通过HTTPS协议访问

2. 升级flutter_webrtc至最新稳定版

你当前使用的0.9.47版本较旧,无法适配Safari 17+的WebRTC API规范。旧版本的polyfill逻辑(如你提到的webkitGetUserMedia兼容代码)已不符合苹果最新限制,升级后可修复该问题:

flutter pub upgrade flutter_webrtc

3. 添加异常捕获避免应用卡顿

原代码未处理权限请求失败的异常,会导致应用无响应。添加try-catch块捕获错误,同时排查具体问题:

try {
  var stream = await navigator.mediaDevices.getUserMedia(mediaConstraints);
  _localStream = stream;
  _localRenderer.srcObject = _localStream;
  stream.getTracks().forEach((element) {
    _peerConnection!.addTrack(element, stream); 
  });
} catch (e) {
  print('getUserMedia请求失败: $e');
  // 可在此添加UI提示,告知用户权限被拒绝或设备不可用
}

4. 修正媒体约束参数

Safari对媒体约束的兼容性更严格,避免使用不支持的参数,使用兼容的约束配置:

final mediaConstraints = {
  'audio': true,
  'video': {
    'width': 640,
    'height': 480,
    'facingMode': 'user'
  }
};

不要设置极端分辨率或帧率,否则会被Safari直接拒绝请求。

5. 遵循用户交互触发规则

苹果要求媒体权限请求必须由用户主动操作触发(如按钮点击),不能在页面加载完成后自动调用。确保getUserMedia的调用逻辑绑定在用户交互事件中,比如按钮的onPressed回调内。

6. 检查系统浏览器权限设置

  • Mac Safari:打开「偏好设置→网站→摄像头/麦克风」,确认你的网站权限为「允许」,若之前被拒绝,需重置权限
  • iOS设备:打开「设置→Safari浏览器→相机/麦克风」(或对应Chrome的设置项),确认权限已开启

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:10:28