LoginSignup
7
6

More than 5 years have passed since last update.

【Swift4.0】loadHTMLString()を使う場合、baseURLを指定しないと外部jsのインクルードに失敗する【WKWebView】

Last updated at Posted at 2017-12-13

takuto3712さんから指摘をいただいて記事を更新しました(2017.12.14)

旧タイトル:
【Swift4.0】WKWebViewのloadHTMLString()だと外部jsのインクルードが失敗する【WKWebView】

WKWebViewのloadHTMLString()でローカルのHTMLをロードした際、参照パスが合ってるにもかかわらずなぜか外部jsファイルのインクルードがうまくいかなくて時間を取られたのでメモ

index.htmlの一部

<script type="text/javascript" src="sample.js"></script>

外部jsファイルのインクルードがNGなコード

Bundle.main.path() → webView.loadHTMLString()

    var path = Bundle.main.path(forResource: "index", ofType: "html")
    var htmlStr:String = ""

    do {
        htmlStr = try String(contentsOfFile: path! ,encoding:.utf8)
    } catch {
        //エラー処理
    }

    // baseURLを指定なし
    webView.loadHTMLString(htmlStr,baseURL: nil)

これだとウェブページとしてロードできるが、sample.jsの読み込みが失敗する。

外部jsファイルのインクルードがOKなコード

Bundle.main.path() → webView.loadHTMLString()

    var path = Bundle.main.path(forResource: "index", ofType: "html")
    var htmlStr:String = ""

    do {
        htmlStr = try String(contentsOfFile: path! ,encoding:.utf8)
    } catch {
        //エラー処理
    }

    // baseURLを指定する
    webView.loadHTMLString(htmlStr,baseURL: URL(fileURLWithPath:path!))

baseURLを指定した場合はsampl.jsのインクルードができる.

外部jsファイルのインクルードがOKなコード

Bundle.main.url() → webView.load()

    let url = Bundle.main.url(forResource: "index", withExtension: ".html")!
    let urlRequest = URLRequest(url: url)
    webView.load(urlRequest)

こちらもsampl.jsのインクルードができる...

まとめ

ローカルのHTMLをloadHTMLString()でロードするときは、第2引数のbaseURLを指定しないと外部jsファイルが読み込めない

7
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6