iOS Swift中WKWebView真机无法加载本地PDF的问题解决
iOS真机WKWebView加载沙盒PDF报错的解决办法
问题原因
WKWebView在iOS真机上有严格的安全限制,不允许直接通过file://协议访问App沙盒内的文件,而模拟器因为权限管控宽松,所以可以正常加载。
解决方法
方法1:配置WKWebView允许文件访问权限
构造WKWebView时,修改配置开启文件访问权限,再加载file://请求:
// 替换成你的PDF文件绝对路径 let pdfPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + "/Sample.pdf" let fileURL = URL(fileURLWithPath: pdfPath) let request = URLRequest(url: fileURL) let webConfig = WKWebViewConfiguration() // 开启文件URL间的访问权限 webConfig.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") webConfig.preferences.setValue(true, forKey: "allowUniversalAccessFromFileURLs") let webView = WKWebView(frame: view.bounds, configuration: webConfig) webView.load(request)
方法2:通过Data加载PDF(更推荐)
绕开file://协议,直接读取文件Data并加载,避免权限限制:
guard let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first else { return } let pdfPath = docDir + "/Sample.pdf" guard let pdfData = try? Data(contentsOf: URL(fileURLWithPath: pdfPath)) else { // 处理文件读取失败的情况 return } let webView = WKWebView(frame: view.bounds) // 加载PDF Data,指定MIME类型为application/pdf webView.load(pdfData, mimeType: "application/pdf", characterEncodingName: "utf-8", baseURL: URL(fileURLWithPath: pdfPath))
权限说明
不需要在Info.plist中添加额外隐私权限,App沙盒的Documents目录属于私有访问范围,本身具备访问权限,问题并非来自系统隐私权限限制。
内容的提问来源于stack exchange,提问作者iOS Swift Architect
相关产品推荐
相关产品推荐

