この記事の経緯
仕事でWKNavigationDelegate
を用いてwebViewを管理することがあり、知らなかったこととかもあったので投稿します。
開発環境
Swift version 5.4.2
Xcode version 12.5.1
webViewはxibで実装
WKNavigationDelegateはコードで実装
web側で開発したLP(ライディングページ)のボタンのアクションをアプリ側(Swift)で操る実装
エラー用Delegateは2つある
1, didFail
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
print("didFail: \(error)")
}
didFail
の用途は読み込み途中にエラーが発生した場合に呼ばれる。
例えば、webViewのload中にアプリを閉じたなど。
2, didFailProvisionalNavigation
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
print("didFailProvisionalNavigation: \(error)")
}
didFailProvisionalNavigation
の用途は読み込み開始時にエラーが発生した場合に呼ばれる。
例えば、圏外だった場合など。
どちらか一方しか記述していない場合、エラー発生の原因捜査で苦労します。
webView内での遷移に関する値はLinkActivatedだけではない
LinkActivated // aタグによる遷移
FormSubmitted // フォームの送信による遷移
BackForward // 進む、戻るによる遷移
Reload // 更新による遷移
FormResubmitted // フォームの再送信による遷移
Other // その他の方法による遷移
LPから課金画面に遷移する実装をしていたので、ついLinkActivatedを気にしていましたが、少し調べると色々出てきました。
navigationAction.navigationType
で指定して扱いましょう。
よく使うDelegateまとめ
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
// 遷移開始時に呼ばれる
}
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
// ページ読み込みが開始されたときに呼ばれる
}
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
// リダイレクトした時に呼ばれる
}
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
// 読み込み開始時にエラーが発生した場合に呼ばれる
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
// 読み込み途中にエラーが発生した場合に呼ばれる
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// 読み込み完了時に呼ばれる
}
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
// webサイトにリクエストを送る場合に呼ばれる
}
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping {
// webサイトからのレスポンスを受け取る場合に呼ばれる
}
func webView(_ webView: WKWebView, authenticationChallenge challenge: URLAuthenticationChallenge, shouldAllowDeprecatedTLS decisionHandler: @escaping (Bool) -> Void) {
// 認証が必要な場合に呼ばれる
}
今回はWKNavigationDelegate
の要点をまとめました。
ぜひ参考にしてください!
お知らせ
現在、iOSアプリ開発の週末バイトや、就業後にできる開発案件(副業)を探しております。
ご依頼はTwitter DMまでお願いします。