如果用户拒绝访问摄像头,如何防止WKWebView显示摄像头模式?

在我的应用程序中,我有一个WKWebView加载一个带有文件输入的网站,允许用户通过相机或照片库上传图像。

我的应用程序包含相机和照片库的隐私使用说明。

如果用户拒绝访问摄像头, WKWebView仍会显示通过摄像头上传图像的选项,并且摄像头模式会显示(尽管它只显示黑色,您通常会看到相机显示的图像) 。 如果用户在“相机”模式中滑动到“video”选项,则应用程序会崩溃。

相关的堆栈跟踪显示:

3 TCC __TCCAccessRequest_block_invoke_2.80 + 222 4 TCC __CRASHING_DUE_TO_PRIVACY_VIOLATION__ + 682

是否可以从本机应用程序端(假设我无法编辑加载的HTML)来阻止WKWebView在这种情况下呈现Camera模式?

因为您提到了__CRASHING_DUE_TO_PRIVACY_VIOLATION__所以应用程序可能实际崩溃,因为您尚未添加iOS10权限说明以使用麦克风。 如果选择“video”,摄像机视图将触发此附加麦克风权限弹出窗口。 在iOS10中,您必须填写呈现给用户的说明,否则应用程序将在您报告时崩溃。 在iOS9中,它只显示通用权限弹出窗口。

尝试在Info.plist文件中添加密钥NSMicrophoneUsageDescription的描述。 在Xcode中,这称为Privacy - Microphone Usage Description

这个其他答案将为您提供各种隐私密钥及其说明的更多详细信息。

它似乎是一个错误,因为它只在选择video时崩溃。 我通过注入JS找到了一个解决方法:

  • 将内容类型设置为仅允许照片。 (示例代码包含在下面)
  • 删除/隐藏输入文件
  • 禁用输入文件
 func requestCamera() { AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in if response { self.injectJavascript() } else { self.webView = WKWebView(frame: .zero) } self.setupRequest() } } func injectJavascript() { let webConfiguration = WKWebViewConfiguration() let contentController = WKUserContentController() let js = "var fileInput = document.getElementById('allMedia'); fileInput.setAttribute('accept', 'image/*');" let userScript = WKUserScript(source: js, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false) contentController.addUserScript(userScript) webConfiguration.userContentController = contentController webView = WKWebView(frame: .zero, configuration: webConfiguration) } func setupRequest() { let url = URL(string: "...")! let request = URLRequest(url: url) webView.load(request) } 

流程如下:

  1. 允许相机访问?
      1. 正常加载WKWebView
    • 没有
      1. 注入JS
      2. 设置WKWebView
      3. 加载WKWebView的请求