JavaScript
iOS
Swift

UIWebViewDelegateを利用してJSの検知や実行を行う

概要

UIWebViewDelegateを利用して特定のJSイベントを検知したり、JSコードを実行する方法を簡単に紹介します。

手法

下記のように、shouldStartLoadWithメソッドでurlを調べることでJSイベントの検知を、webViewDidFinishLoadでwebView.stringByEvaluatingJavaScriptを呼ぶことでJSの実行を行うことができます。

UIWebViewDelegateを利用してJSの検知・実行を行う
class WebViewController: UIViewController, UIWebViewDelegate {
    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.webView.delegate = self
    }


    // MARK: - UIWebViewDelegate
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if let requestUrl = request.url, requestUrl.absoluteString.contains("YOUR_JS_CODE") {
            // JSコードを検知
        }

        return true
    }

    func webViewDidFinishLoad(_ webView: UIWebView) {
        // JSコードを作成・実行
        let jsCode = createJSCode()
        webView.stringByEvaluatingJavaScript(from: jsCode)
    }
}

用例

例えば、下記のように"document.title"のコードを差し込むことでWebViewのタイトルを取得し、ネイティブのNavigation titleに挿入するといったことも可能になります。

WebViewのタイトルをJSで取得する
func webViewDidFinishLoad(_ webView: UIWebView) {
    self.navigationItem.title = webView.stringByEvaluatingJavaScript(from: "document.title")
}