Swift开发中WKWebView加载网页时摄像头无法正常工作问题咨询
WKWebView网页摄像头无法调用解决方案
1. 初始化时配置WKWebView参数
默认WKWebView关闭了媒体捕获相关权限,需要主动开启配置:
let config = WKWebViewConfiguration() // 允许媒体内联播放,无需强制全屏 config.allowsInlineMediaPlayback = true // 取消媒体播放需用户手势触发的限制 config.mediaTypesRequiringUserActionForPlayback = [] // iOS15+ 显式允许媒体捕获 if #available(iOS 15.0, *) { config.allowsMediaCapture = true } // 必须设置UIDelegate处理网页权限请求 let webView = WKWebView(frame: .zero, configuration: config) webView.uiDelegate = self
2. 实现WKUIDelegate权限回调
网页调用摄像头时会触发该回调,需要主动向网页授予权限,否则WKWebView会默认拒绝请求:
extension ViewController: WKUIDelegate { // iOS15+ 适配 @available(iOS 15.0, *) func webView(_ webView: WKWebView, decideMediaCapturePermissionsFor origin: WKSecurityOrigin, initiatedBy frame: WKFrameInfo, type: WKMediaCaptureType) async -> WKPermissionDecision { // 可根据origin判断是否为信任域名,信任则返回.grant,否则返回.deny return .grant } // iOS14及更早版本适配 func webView(_ webView: WKWebView, requestMediaCapturePermissionFor origin: WKSecurityOrigin, initiatedByFrame frame: WKFrameInfo, type: WKMediaCaptureType, decisionHandler: @escaping (WKPermissionDecision) -> Void) { decisionHandler(.grant) } }
3. 提前申请系统级媒体权限
必须在加载网页之前完成系统摄像头、麦克风权限申请,避免权限不同步导致网页请求失败:
import AVFoundation AVCaptureDevice.requestAccess(for: .video) { [weak self] videoGranted in guard videoGranted else { return } AVCaptureDevice.requestAccess(for: .audio) { [weak self] audioGranted in guard audioGranted else { return } DispatchQueue.main.async { // 权限获取完成后再加载网页 let request = URLRequest(url: URL(string: "你的网页地址")!) self?.webView.load(request) } } }
4. 确认配置完整性
- 检查plist文件已添加
NSCameraUsageDescription和NSMicrophoneUsageDescription权限声明及对应使用说明 - 若加载的是HTTP协议网页,需在plist的
NSAppTransportSecurity配置中添加对应域名例外或开启NSAllowsArbitraryLoads - 注意WKWebView对
getUserMediaAPI的最低支持版本为iOS11,低于该版本系统无法正常调用
排查技巧
可通过Safari开发者工具连接设备上的WKWebView,查看网页控制台报错信息,若返回Permission denied则优先检查上述权限回调是否正确实现,若返回其他错误可对应排查网页侧代码逻辑。
内容的提问来源于stack exchange,提问作者Bhavdip
相关产品推荐
相关产品推荐

