下記ブログの転載です!
https://rc-code.info/ios/post-194/
iOSにて、WKWebView
でJavaScriptのコールバックを受けつける必要があったので備忘録。
今回は WKUserContentController
を利用した方法を紹介します。
WKWebView の使い方
まずは WKWebView
の基本的な使い方ですが、こちらを参考にしていただければと思います。
WKUserContentController の使い方
WKUserContentController
はJavaScript
からのコールバック受信や、スクリプトをWebビューに挿入する方法を提供します。
下記が導入のサンプルコードです。
import UIKit
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
override func loadView() {
// ① WKUserContentController の生成
let userContentController = WKUserContentController()
// ② WKUserContentController にコールバックハンドラを登録
userContentController.add(self, name: "jsCallbackHandler")
let webConfiguration = WKWebViewConfiguration()
// ③ WKWebViewConfiguration に生成した WKUserContentController を登録する
webConfiguration.userContentController = userContentController
webView = WKWebView(frame: .zero, configuration: webConfiguration)
view = webView
}
}
// ④ WKScriptMessageHandler のデリゲートを記載
extension ViewController: WKScriptMessageHandler {
// ⑤ JavaScript から呼び出されるコールバックハンドラ関数を記載
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
switch message.name {
case "jsCallbackHandler":
print("Javascript message arrived: jsCallbackHandler")
default:
return
}
}
}
1 WKUserContentController の生成
WKUserContentController
はWKWebViewConfiguration
に格納する必要があるので、まずはインスタンスを生成します。
2 WKUserContentController にコールバックハンドラを登録
WKUserContentController
のadd関数を用いて、JavaScript
から実行したい関数を持つクラスインスタンス(WKScriptMessageHandler
プロトコルに準拠したクラス)を第一引数に設定し、コールバックの判別に利用するためのString
をname引数に設定します。
このadd関数は何度も実行できるので、複数のコールバックを処理したい場合はname引数を変更して実行すれば、後述するコールバック関数内で判定することができます。
3 WKWebViewConfiguration に生成した WKUserContentController を登録する
生成したWKUserContentController
インスタンスは、WKWebViewConfiguration
のuserContentController
プロパティに格納します。
4 WKScriptMessageHandler のデリゲートを記載
上記ViewController
はデリゲート先としてWKUserContentController
に渡され登録されているので、WKScriptMessageHandler
プロトコルに準拠させる必要があります。
5 JavaScript から呼び出されるコールバックハンドラ関数を記載
WKScriptMessageHandler
プロトコルに準拠させるために、userContentController関数
を実装します。この関数を実装する事で、Javascript
からのコールバックを受け付けることができるようになります。
JSからは下記のように、②の箇所のadd関数にてname引数
に指定したコールバックを実行します。
webkit.messageHandlers.jsCallbackHandler.postMessage("Message from Javascript");
コールバックハンドラ内ではmessage.name
プロパティでコールバック名を取得することができるので、サンプルコードのようにswitch文等で判定する事で、処理を分岐させる事ができます。
検証Playground
検証環境
Mac: 10.13.6
XCode: 10.1
Swift: 4.2.1
参考ドキュメント
公式 WKWebView ドキュメント
公式 WKWebViewConfiguration ドキュメント
公式 WKUserContentController ドキュメント