web-dev-qa-db-ja.com

ローカルリソースをロードするときのUIWebViewとWKWebViewの違いは何ですか

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がそれを使用できるのでしょうか?

30
Rufus

いくつかのポイント:

  1. Apple 推奨 iOS 8以降ではWKWebviewを使用します。 UIWebViewを使用して新しいコードを記述することは避けます。

IOS 8以降で実行されるアプリでは、WKWebViewを使用する代わりにUIWebViewクラスを使用します。さらに、JavaScriptの実行が想定されていないファイルをレンダリングする場合は、WKPreferencesプロパティjavaScriptEnabledfalseに設定することを検討してください。

  1. Appleはpathから離れようとしていますが、代わりにURIローカルファイルでも。 /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://)があります。他の一般的なスキームはhttphttpsftpなどです。これはリソースへの完全なアドレスであるため、両方のビューが解決方法を知っています。
35
Code Different

これは、セキュリティ上の理由、またはWKWebView AP​​Iの実装方法が原因である可能性があります。

WKWebViewには、loadFileURL(_:allowingReadAccessTo:)と呼ばれるローカルリソースをロードするための特定のインスタンスメソッドがあります。これはiOS 9で導入されました。

注意

IOS 8.0以降を対象とする場合は、WKWebViewの代わりにUIWebViewを使用する必要があります。参照: https://developer.Apple.com/reference/webkit/wkwebview

3
Ryan H.