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
を使用します。 UIWebView
を使用して新しいコードを記述することは避けます。IOS 8以降で実行されるアプリでは、
WKWebView
を使用する代わりにUIWebView
クラスを使用します。さらに、JavaScriptの実行が想定されていないファイルをレンダリングする場合は、WKPreferences
プロパティjavaScriptEnabled
をfalse
に設定することを検討してください。
/path/to/file.png
を使用せず、代わりにfile:///path/to/file.png
を使用することをお勧めします。1つのURLが機能し、他の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
はスキーム(別名プロトコル)を提供しません。到達しようとしているリソースの絶対アドレスを提供するために、別のURLと組み合わせてのみ使用する必要があります。 UIWebView
は後方互換性のためにサポートしていますが、AppleはWKWebView
でクリーンアップを開始することにしました。fileURL
には、リソースがローカルファイルシステムにあることを伝えるスキーム(file://
)があります。他の一般的なスキームはhttp
、https
、ftp
などです。これはリソースへの完全なアドレスであるため、両方のビューが解決方法を知っています。これは、セキュリティ上の理由、またはWKWebView
APIの実装方法が原因である可能性があります。
WKWebView
には、loadFileURL(_:allowingReadAccessTo:)
と呼ばれるローカルリソースをロードするための特定のインスタンスメソッドがあります。これはiOS 9で導入されました。
IOS 8.0以降を対象とする場合は、WKWebView
の代わりにUIWebView
を使用する必要があります。参照: https://developer.Apple.com/reference/webkit/wkwebview