在我的应用中,我有一个WKWebView
加载一个带有文件输入的网站,允许用户通过相机或照片库上传图像。
我的应用程序包含相机和照片库的隐私使用说明。
如果用户拒绝访问相机,WKWebView
仍会显示通过相机上传图片的选项,相机模式会显示(尽管它只会显示您通常会看到的黑色)相机显示的图像)。如果用户在“相机”模式中滑动到“视频”选项,则应用程序会崩溃。
相关的堆栈跟踪显示:
3 TCC __TCCAccessRequest_block_invoke_2.80 + 222
4 TCC __CRASHING_DUE_TO_PRIVACY_VIOLATION__ + 682
是否可以从原生应用程序端(假设我无法编辑加载的HTML)来阻止WKWebView
在这种情况下呈现相机模式?
答案 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)
}
流程如下: