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ファイルが読み込めない