Edited at

WKWebViewについてのまとめ

More than 1 year has passed since last update.

WKWebViewのサンプルを作成したのでメモを残しておきます。

ソースコードはこちら


開発環境


  • Xcode:9.4.1

  • Swift:4.1.2


実装


WKWebViewのセットアップ


Setup

// MARK: - Setup WKWebView

private func setupWKWebView() {

let webConfig = WKWebViewConfiguration()
wkWebView = WKWebView(frame: .zero, configuration: webConfig)
wkWebView.navigationDelegate = self // Delegate①:画面の読み込み・遷移系
wkWebView.uiDelegate = self // Delegate②:jsとの連携系

view = wkWebView
}



Webページのロード


Load

// MARK: - Load Web Page

private func load(withURL urlStr:String) {
guard let url = URL(string: urlStr) else { return }
let request = URLRequest(url: url)

wkWebView.load(request)
}



Delegateメソッド

Delegate①:画面の読み込み・遷移系


WKNavigationDelegate

// MARK: - 読み込み設定(リクエスト前)

func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
print("リクエスト前")

/* これを設定しないとアプリがクラッシュする
* .allow : 読み込み許可
* .cancel : 読み込みキャンセル
*/

decisionHandler(.allow)
}

// MARK: - 読み込み準備開始
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print("読み込み準備開始")
}

// MARK: - 読み込み設定(レスポンス取得後)
func webView(_ webView: WKWebView,
decidePolicyFor navigationResponse: WKNavigationResponse,
decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
print("レスポンス取得後")

/* これを設定しないとアプリがクラッシュする
* .allow : 読み込み許可
* .cancel : 読み込みキャンセル
*/

decisionHandler(.allow)
// 注意:受け取るレスポンスはページを読み込みタイミングのみで、Webページでの操作後の値などは受け取れない
}

// MARK: - 読み込み開始
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
print("読み込み開始")
}

// MARK: - ユーザ認証(このメソッドを呼ばないと認証してくれない)
func webView(_ webView: WKWebView,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
print("ユーザ認証")
completionHandler(.useCredential, nil)
}

// MARK: - 読み込み完了
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("読み込み完了")
}

// MARK: - 読み込み失敗検知
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError: Error) {
print("読み込み失敗検知")
}

// MARK: - 読み込み失敗
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError: Error) {
print("読み込み失敗")
}

// MARK: - リダイレクト
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation:WKNavigation!) {
print("リダイレクト")
}


Delegate②:jsとの連携系


WKUIDelegate

今回こちらは実装しませんでした.

余力があれば後日追記します.


実行結果


実行結果

リクエスト前

読み込み準備開始
レスポンス取得後
読み込み開始
ユーザ認証
ユーザ認証
読み込み完了

想定通りに動いてくれて良かった(認証が2回通ってるけど...)


まとめ

まだまだ深く突っ込めると思うのでもう少し触ってみようと思いますー

ご指摘などいただけると嬉しいです。