加载本地资源时UIWebView和WKWebView有什么区别
What's the difference between UIWebView and WKWebView when loading local resources
我想用webView加载本地资源。我用 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不能。但是如果我使用
uiWebView.loadRequest(URLRequest(url:fileUrl))
wkWebView.load(URLRequest(url:fileUrl))
uiWebView 和 wkWebView 都可以正常工作。
我很困惑,谁能为我解释一下:
我不应该使用 URL(string: realPath) 作为本地资源吗?但是为什么 UIWebView 可以用呢?
这可能是出于安全原因,或者只是 WKWebView
API 的实施方式。
WKWebView
有一个用于加载本地资源的特定实例方法,称为 loadFileURL(_:allowingReadAccessTo:)
。这是在 iOS 9.
中引入的
备注
如果您的目标是 iOS 8.0 或更高版本,您应该使用 WKWebView
而不是 UIWebView
。参见:https://developer.apple.com/reference/webkit/wkwebview
几点:
- Apple recommends 您将
WKWebview
用于 iOS 8 及更高版本。我会避免使用 UIWebView
. 编写新代码
In apps that run in iOS 8 and later, use the WKWebView
class instead of using UIWebView
. Additionally, consider setting the WKPreferences
property javaScriptEnabled
to false
if you render files that are not supposed to run JavaScript.
- Apple 一直在尝试摆脱 path,而是想对本地文件使用 URI。他们建议您不要使用
/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
等。它是资源的完整地址,因此两个视图都知道如何解析它。
我想用webView加载本地资源。我用 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不能。但是如果我使用
uiWebView.loadRequest(URLRequest(url:fileUrl))
wkWebView.load(URLRequest(url:fileUrl))
uiWebView 和 wkWebView 都可以正常工作。 我很困惑,谁能为我解释一下: 我不应该使用 URL(string: realPath) 作为本地资源吗?但是为什么 UIWebView 可以用呢?
这可能是出于安全原因,或者只是 WKWebView
API 的实施方式。
WKWebView
有一个用于加载本地资源的特定实例方法,称为 loadFileURL(_:allowingReadAccessTo:)
。这是在 iOS 9.
备注
如果您的目标是 iOS 8.0 或更高版本,您应该使用 WKWebView
而不是 UIWebView
。参见:https://developer.apple.com/reference/webkit/wkwebview
几点:
- Apple recommends 您将
WKWebview
用于 iOS 8 及更高版本。我会避免使用UIWebView
. 编写新代码
In apps that run in iOS 8 and later, use the
WKWebView
class instead of usingUIWebView
. Additionally, consider setting theWKPreferences
propertyjavaScriptEnabled
tofalse
if you render files that are not supposed to run JavaScript.
- Apple 一直在尝试摆脱 path,而是想对本地文件使用 URI。他们建议您不要使用
/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
等。它是资源的完整地址,因此两个视图都知道如何解析它。