2017-08-04 130 views
3

私のアプリでは、WKWebViewを使って、ユーザーがカメラや写真ライブラリ経由で画像をアップロードできるようにするファイル入力が可能なウェブサイトを読み込んでいます。ユーザーがカメラへのアクセスを拒否した場合、WKWebViewがCameraモーダルを表示しないようにするにはどうすればよいですか?

私のアプリには、カメラとフォトライブラリの両方のプライバシーの使用方法の説明があります。

ユーザーがカメラへのアクセスを拒否した場合でも、WKWebViewにはカメラ経由で画像をアップロードするオプションが表示され、カメラモードが表示されます(通常は、カメラが表示されています)。ユーザーがカメラモーダルでビデオオプションにスワイプすると、アプリケーションがクラッシュします。

関連するスタックトレースを示しています

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

は、ネイティブアプリ側からそれが可能です(私がロードされたHTMLを編集することはできませんと仮定)この場合にはカメラのモーダルを提示からWKWebViewを防ぐために?

答えて

2

あなたがマイクを使用するためのiOS10許可の記述を追加していないので、アプリはおそらく、実際にクラッシュさ__CRASHING_DUE_TO_PRIVACY_VIOLATION__を述べたので。ビデオを選択した場合、カメラビューはこの追加のマイクパーミッションポップアップを起動します。 iOS10では、ユーザーに提示された説明を入力する必要があります。そうしないと、アプリが報告したとおりにクラッシュします。 iOS9では、一般的な権限のポップアップが表示されます。

Info.plistファイルにキーNSMicrophoneUsageDescriptionの説明を追加してみてください。 Xcodeでは、これはPrivacy - Microphone Usage Description

と呼ばれ、このother answerは、さまざまなプライバシーキーとその説明の詳細を示します。

1

動画が選択されているとクラッシュするだけなので、バグのようです。私はJSを注入することで回避策を見つけました:

  • 写真のみを許可するようにコンテンツタイプを設定してください。

    1. カメラのアクセスを許可:
    2. が削除/
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) 
} 

Flowは、次の通りである入力ファイルを無効にする入力ファイル

  • を隠す(以下のサンプルコードは含まれていますか)?
    • はい
      1. ロードWKWebView通常
      1. を注入JS
      2. セットアップWKWebView
      3. ロードWKWebViewの要求
  • +0

    これは興味深い回避策です。私はそれがクラッシュを解決するのに役立つので投票しましたが、他の誰かが中核的な問題を解決する可能性のある答えを持っている場合に受け入れるのを待つつもりです。レスポンスありがとう! –

    +0

    私はバグレポートを送ってくれました。サポートチームからの回答があれば投稿を更新します – nathan

    関連する問題