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

Mac Catalyst WKWebView中navigator.mediaDevices.getUserMedia无法使用求助

解决Mac Catalyst WKWebView中navigator.mediaDevices.getUserMedia未定义问题

在Mac Catalyst WKWebView中遇到错误:TypeError: undefined is not an object (evaluating 'navigator.mediaDevices.getUserMedia')
环境:macOS 13.5.1 (22G90),Safari 17.0,UserAgent为Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15
iOS端运行正常,已添加原生相机/麦克风权限且已获批,但问题依旧;iOS端无需手动权限检查,Safari会自动请求。

排查与解决方案

1. 配置WKWebView的媒体权限策略

Mac Catalyst下的WKWebView不会自动继承系统权限,需要显式配置权限策略:

  • 直接全局授权媒体捕获:
let config = WKWebViewConfiguration()
config.mediaCapturePermissionPolicy = .grant
// 同时开启内联媒体播放(可选,但部分场景需要)
config.allowsInlineMediaPlayback = true
config.mediaTypesRequiringUserActionForPlayback = []

let webView = WKWebView(frame: .zero, configuration: config)
  • 动态处理权限(适合需要验证域名的场景):
    实现WKNavigationDelegate的权限请求方法:
func webView(_ webView: WKWebView, requestMediaCapturePermissionFor origin: WKSecurityOrigin, initiatedBy frame: WKFrameInfo, completionHandler: @escaping (WKPermissionDecision) -> Void) {
    // 可根据origin判断是否授权,这里直接允许
    completionHandler(.grant)
}

记得给WKWebView设置navigationDelegate = self。

2. 补全Info.plist的权限描述

Mac Catalyst需要同时包含iOS和macOS的权限描述键,确保:

  • 项目的Info.plist中添加NSCameraUsageDescription和NSMicrophoneUsageDescription
  • 在Xcode的"Target > Info > Mac Catalyst"区域,确认这两个描述键已存在并填写了合理的提示文本

3. 更新UserAgent版本

当前UserAgent模拟的是macOS 10.15.7,可能导致WebKit禁用navigator.mediaDevicesAPI。修改为对应macOS 13的UserAgent:

webView.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15"

4. 提前获取原生权限

确保在WKWebView加载页面前,已经通过AVFoundation获取到相机和麦克风权限:

import AVFoundation

func prepareMediaPermissions() {
    AVCaptureDevice.requestAccess(for: .video) { videoGranted in
        guard videoGranted else { return }
        AVCaptureDevice.requestAccess(for: .audio) { audioGranted in
            DispatchQueue.main.async {
                // 权限获取完成后再加载网页
                self.webView.load(URLRequest(url: yourWebUrl))
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:06:18