万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    SwiftのWKWebViewにてJSの利用

    WKWebViewを使う時JSを呼びたい。

    class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {

    そしてviewDidAppearに定義

    override func viewDidAppear(_ animated: Bool){
            print("viewDidAppear")
            
            let screenWidth:CGFloat = view.frame.size.width
            let screenHeight:CGFloat = view.frame.size.height
            
            // iPhone X , X以外は0となる
            if #available(iOS 11.0, *) {
                let window = UIApplication.shared.keyWindow
                topPadding = window!.safeAreaInsets.top
            }
            
            // Webページの大きさを画面に合わせる
            let rect = CGRect(x: 0,
                              y: topPadding,
                              width: screenWidth,
                              height: screenHeight - topPadding)
            
            let webConfiguration = WKWebViewConfiguration()
            webView = WKWebView(frame: rect, configuration: webConfiguration)
    
            let url = "対象のURLを書く"
            let webUrl = URL(string: url)!
            let myRequest = URLRequest(url: webUrl)
            webView.load(myRequest)

    WKNavigationDelegateインターフェイスみたいなを実装。これしないと 以下のことをしてもwebViewメソッドが呼ばれない

    webView.navigationDelegate = self

    こうすると、webViewという名前のメソッドを用意すると以下がURLをロードするたびに勝手に呼んでんでくれる。

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

    引数にあるdidFinishだと成功するけど、 didCommitはWebViewで表示される前に取れるっぽくて失敗する。