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
相关产品推荐
相关产品推荐

