我想用webView加载本地资源。我用UIWebView和WKWebView构建了一个演示程序,用下面的代码做一些测试。
curl -F fabric_key=<key> \
-F build_secret=<secret> \
-F dsym_zipfile=@<path-to-zip> \
https://fabric.io/api/v2/upload-dsyms
uiWebView可以加载资源,但wkWebView不能。但是,如果我使用
let uiWebView = UIWebView(frame: self.view.bounds)
self.view.addSubview(uiWebView)
let wkWebView = WKWebView(frame:CGRect(x: 0, y: 400, width: 500, height: 500))
self.view.addSubview(wkWebView)
let path = Bundle.main.path(forResource:"1", ofType: "png")
guard let realPath = path else {
return
}
let url = URL(string: realPath)
let fileUrl = URL(fileURLWithPath: realPath)
if let realUrl = url {
uiWebView.loadRequest(URLRequest(url:realUrl))
wkWebView.load(URLRequest(url:realUrl))
}
// uiWebView.loadRequest(URLRequest(url:fileUrl))
// wkWebView.load(URLRequest(url:fileUrl))
uiWebView和wkWebView都能正常运行。 我很困惑,任何人都可以为我解释: 我不应该为本地资源使用URL(字符串:realPath)吗?但是为什么UIWebView可以使用它呢?
答案 0 :(得分:33)
几点:
WKWebview
的Apple recommends。我会避免使用UIWebView
编写新代码。
醇>
在iOS 8及更高版本中运行的应用中,请使用
WKWebView
类而不是UIWebView
。另外,如果您渲染不应运行JavaScript的文件,请考虑将WKPreferences
属性javaScriptEnabled
设置为false
。
/path/to/file.png
并使用file:///path/to/file.png
代替。至于为什么一个URL工作而另一个不工作,让我们做一个最小的例子:
let realPath = "/path/to/file.png"
let url = URL(string: realPath) // /path/to/file.png
let fileUrl = URL(fileURLWithPath: realPath) // file:///path/to/file.png
url
不提供方案(a.k.a协议)。它应该只与另一个URL一起使用,以提供您尝试访问的资源的绝对地址。 UIWebView
支持它是出于向后兼容的原因,但Apple决定使用WKWebView
开始清理。fileURL
有一个方案(file://
),告诉资源位于本地文件系统上。其他常见方案有http
,https
,ftp
等。它是资源的完整地址,因此两个视图都知道如何解决它。答案 1 :(得分:3)
这可能是出于安全原因,或者仅仅是WKWebView
API的实现方式。
WKWebView
有一个特定的实例方法,用于加载名为loadFileURL(_:allowingReadAccessTo:)
的本地资源。这是在iOS 9中引入的。
如果您定位的是iOS 8.0或更高版本,则应使用WKWebView
代替UIWebView
。请参阅:https://developer.apple.com/reference/webkit/wkwebview