LoginSignup
16
13

More than 5 years have passed since last update.

WKWebViewで表示されるHTMLおよびPlainText、JSONを取得する

Posted at

WKNavigationDelegateを受け取る

  • webViewはWKWebViewとする
  • WKNavigationDelegateを受け取るようにする
webView.navigationDelegate = self

WkWebView#evaluateJavaScriptでJavaScript実行

以下のようにdidCommitで、JavaScriptを実行してHTML全体を受け取る

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
    webView.evaluateJavaScript(
        "document.body.innerHTML",
        completionHandler: { (html: Any?, error: Error?) in
            if let html = html as? String {
                print(html)
            }
        }
    )
}

もちろん、JavaScriptなのでgetElementByIdで、あるidのinputタグのvalueを得ることもできる

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
    webView.evaluateJavaScript(
        "document.getElementById('username').value",
        completionHandler: { (value: Any?, error: Error?) in
            if let username = value as? String {
                print(username)
            }
        }
    )
}

PlainTextやJSONの場合

上記のevaluateJavaScriptで取得するとpreタグの中に入ってくる。(実際はHTMLに改行はなく1行である)。Content-Type:text/plain、もしくは、application/jsonでも、preタグの中に入ってくる。

<html>
  <head></head>
  <body>
    <pre style="word-wrap: break-word; white-space: pre-wrap;">AnyText</pre>
  </body>
</html>

getElementsByTagNameでpreの内容を得る

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
    webView.evaluateJavaScript(
        "document.getElementsByTagName('pre')[0].innerText",
        completionHandler: { (text: Any?, error: Error?) in
            if let text = text as? String {
                print(text)
            }
        }
    )
}

ちなみにdidCommitじゃなくdidFinishでもevaluateJavaScriptで中身を取れます。didCommitはWebViewで表示される前に取れるようです。

16
13
1

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
16
13