问题描述
对于以前的 iOS 8 测试版,加载一个本地网络应用程序(在 Bundle 中),它适用于 UIWebView
和 WKWebView
,我什至使用新的 WKWebView
API.
var url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("car", ofType:"html"))webView = WKWebView(frame:view.frame)webView!.loadRequest(NSURLRequest(URL:url))view.addSubview(webView)
但在测试版 4 中,我只看到一个空白屏幕(UIWebView
仍然有效),看起来没有加载或执行任何内容.我在日志中看到一个错误:
无法为 /
有什么帮助可以指导我走向正确的方向吗?谢谢!
他们终于解决了这个bug!现在我们可以使用 -[WKWebView loadFileURL:allowingReadAccessToURL:]
.显然,所说,这是 WKWebView ,正如他所说,有一个解决方法:)
我回答只是因为我想在这里展示解决方法.https://github.com/shazron/WKWebViewFIleUrlTest 中显示的 IMO 代码充满了大多数人不相关的细节可能不感兴趣.
解决方法是 20 行代码,包括错误处理和注释,不需要服务器 :)
func fileURLForBuggyWKWebView8(fileURL: URL) throws ->网址{//一些安全检查如果 !fileURL.isFileURL {抛出 NSError(域:BuggyWKWebViewDomain",代码:1001,userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("URL 必须是文件 URL.", comment:"")])}尝试!fileURL.checkResourceIsReachable()//创建/temp/www"目录让 fm = FileManager.default让 tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("www")尝试!fm.createDirectory(at: tmpDirURL, withIntermediateDirectories: true, attributes: nil)//现在将给定的文件复制到临时目录让 dstURL = tmpDirURL.appendingPathComponent(fileURL.lastPathComponent)让 _ = 试试?fm.removeItem(at: dstURL)尝试!fm.copyItem(at: fileURL, to: dstURL)//"/temp/www" 中的文件加载错误:)返回 dstURL}
并且可以用作:
override func viewDidLoad() {super.viewDidLoad()var fileURL = URL(fileURLWithPath: Bundle.main.path(forResource:"file", ofType: "pdf")!)如果#available(iOS 9.0, *) {//iOS9 及以上.一年后一切正常.webView.loadFileURL(fileURL, allowedReadAccessTo: fileURL)} 别的 {//iOS8.事情(有时)可以解决//勇敢的人可以做到这一点//fileURL = 试试!pathForBuggyWKWebView8(fileURL: fileURL)//webView.load(URLRequest(url: fileURL))做 {fileURL = 尝试 fileURLForBuggyWKWebView8(fileURL: fileURL)webView.load(URLRequest(url: fileURL))} catch let error as NSError {打印(错误:" + error.debugDescription)}}}
For previous iOS 8 betas, load a local web app (in Bundle) and it works fine for both UIWebView
and WKWebView
, and I even ported a web game using the new WKWebView
API.
var url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("car", ofType:"html"))
webView = WKWebView(frame:view.frame)
webView!.loadRequest(NSURLRequest(URL:url))
view.addSubview(webView)
But in beta 4, I just got a blank white screen (UIWebView
still work), looks like nothing is loaded or executed. I saw an error in the log:
Could not create a sandbox extension for /
Any help to guide me to the right direction? Thanks!
They finally solved the bug! Now we can use -[WKWebView loadFileURL:allowingReadAccessToURL:]
.Apparently the fix was worth some seconds in WWDC 2015 video 504 Introducing Safari View Controller
For iOS8 ~ iOS10 (Swift 3)
As Dan Fabulish's answer states this is a bug of WKWebView and as he said there is a work-around :)
I am answering just because I wanted to show the work-around here. IMO code shown in https://github.com/shazron/WKWebViewFIleUrlTest is full of unrelated details most people are probably not interested in.
The work-around is 20 lines of code, error handling and comments included, no need of a server :)
func fileURLForBuggyWKWebView8(fileURL: URL) throws -> URL {
// Some safety checks
if !fileURL.isFileURL {
throw NSError(
domain: "BuggyWKWebViewDomain",
code: 1001,
userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("URL must be a file URL.", comment:"")])
}
try! fileURL.checkResourceIsReachable()
// Create "/temp/www" directory
let fm = FileManager.default
let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("www")
try! fm.createDirectory(at: tmpDirURL, withIntermediateDirectories: true, attributes: nil)
// Now copy given file to the temp directory
let dstURL = tmpDirURL.appendingPathComponent(fileURL.lastPathComponent)
let _ = try? fm.removeItem(at: dstURL)
try! fm.copyItem(at: fileURL, to: dstURL)
// Files in "/temp/www" load flawlesly :)
return dstURL
}
And can be used as:
override func viewDidLoad() {
super.viewDidLoad()
var fileURL = URL(fileURLWithPath: Bundle.main.path(forResource:"file", ofType: "pdf")!)
if #available(iOS 9.0, *) {
// iOS9 and above. One year later things are OK.
webView.loadFileURL(fileURL, allowingReadAccessTo: fileURL)
} else {
// iOS8. Things can (sometimes) be workaround-ed
// Brave people can do just this
// fileURL = try! pathForBuggyWKWebView8(fileURL: fileURL)
// webView.load(URLRequest(url: fileURL))
do {
fileURL = try fileURLForBuggyWKWebView8(fileURL: fileURL)
webView.load(URLRequest(url: fileURL))
} catch let error as NSError {
print("Error: " + error.debugDescription)
}
}
}
这篇关于WKWebView 不加载 iOS 8 下的本地文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!