代码之家  ›  专栏  ›  技术社区  ›  M-P

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

  •  5
  • M-P  · 技术社区  · 9 年前

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

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

    如果用户拒绝访问摄像机,则 WKWebView

    相关堆栈跟踪显示:

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

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   Joe Schofield    9 年前

    因为你提到 __CRASHING_DUE_TO_PRIVACY_VIOLATION__

    尝试添加密钥的描述 NSMicrophoneUsageDescription Info.plist Privacy - Microphone Usage Description

    other answer 将为您提供各种隐私密钥及其描述的更多详细信息。

        2
  •  1
  •   nathan    9 年前

    这似乎是一个错误,因为它只有在选择视频时才会崩溃。我通过注入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. 设置WKWebView