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で表示される前に取れるっぽくて失敗する。