iOS WKWebviewのevaluateJavaScriptの戻り値について

予想外な挙動をしたので調べてみた。そのうち仕様が変わりそうな予感







個人的にやりたかったこと


例えば
というHTML要素があったりなかったりして、それの存在チェックによって処理を切り替えたい。evaluateJavaScriptを使用すれば任意のjavascrriptが実行できるのでそれでチェックできるはず。



evaluateJavaScriptを使用してdivタグの要素を取得する


var webview: WKWebView = WKWebView()
// ...... WKWebView周りの処理

webView.evaluateJavaScript(
    "document.getElementById(\"divArea\")",
    completionHandler: { (html, error) -> Void in
        print(html )
        if html != nil {
            // ...
        }
})

htmlの中身は以下
取り出し方がわからない...
html Any? some
payload_data_0 Builtin.RawPointer
payload_data_1 Builtin.RawPointer
payload_data_2 Builtin.RawPointer



evaluateJavaScriptを使用してBool値を受け取る



ならばnullと比較すればどうか?
javascriptなのでnilじゃないよ!


webView.evaluateJavaScript(
    "document.getElementById(\"divArea\") == null",
    completionHandler: { (html, error) -> Void in
        print(html")  // Optional(1)
        print(html as? String")  // nil
        print(html as? Bool")  // true
        print(html as? Int")  // 1
})

てっきり文字列で帰ってくると思っていたのでちょっとハマる。


evaluateJavaScriptを使用して浮動小数点数を受け取る



もう少し調べる


webView.evaluateJavaScript(
    "0.1",
    completionHandler: { (html, error) -> Void in
        print(html)  // Optional(0.1)
        print(html as? String)  // nil
        print(html as? Int)  // Optional(0)
        print(html as? Double)  // (0.10000000000000001)

        if html as? String != nil {
            self.keyChain.setString("1", forKey: "loggedin")
        }
        else {
            self.keyChain.setString("", forKey: "loggedin")
        }
})


0.1の取り出し方がわからないがなんとなく仕組みはわかってきた。



evaluateJavaScriptを使用してテキストフィールドの値を受け取る



テキストフィールドの中に数値や文字が入っていたらどうなるんだろう?
<input type="text" id="textField">
がある画面に対して以下のjavascriptを実行する

webView.evaluateJavaScript(
    "document.getElementById(\"textField\").value",
    completionHandler: { (html, error) -> Void in
        print(html as? String)  // Optional("13577")
        print(html as? Int)  // nil
})

数値でなく文字列で返ってくるらしい


まとめ



・javascriptの演算はjavascriptの仕様に準ずる
・HTMLの要素は文字列として取得される
ということ?
わかってしまえばそこまで複雑でもない
ただしDOM要素の変換の仕方と浮動小数点数の扱いがよくわからなかった

2016年12月7日水曜日