如果用户拒绝访问摄像头,如何防止WKWebView呈现Camera模式?

时间:2017-08-04 19:46:16

标签: ios iphone camera ios10

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

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

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

相关的堆栈跟踪显示:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

other answer将为您提供有关各种隐私密钥及其说明的更多详细信息。

答案 1 :(得分:1)

它似乎是一个错误,因为它只会在选择视频时崩溃。我通过注入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的请求