WKWebView サーバからのステータスコードのとり方
Table of Contents
WebViewを使用しているアプリで、サーバから返るレスポンスコードが必要な時があるかと思います。そんなときに便利な方法があったので、まとめておきます。
サーバエラー系 #
// ViewController
override func viewDidLoad() {
super.viewDidLoad()
webView..navigationDelegate = self
}
// WKNavigationDelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse,
decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
// navigationResponse.response は URLResponse ですが、
// HTTPURLResponseにキャストすることで、ステータスコードがとれるようになります
if let response = navigationResponse.response as? HTTPURLResponse {
switch response.statusCode {
case 502:
// 例えば、アラートを表示したり
showAlert(title: "502 Bad Gateway", message: "時間を開けて再度アクセスしてください")
// 例えば、502用のViewを表示したり
let labelFor502 = UILabel(frame: webView.bounds)
labelFor502.numberOfLines = 0
labelFor502.text = "サーバエラーです。時間を開けてリクエストしてください。"
labelFor502.font = .boldSystemFont(ofSize: 17)
webView.addSubview(labelFor502)
decisionHandler(.cancel)
return
case 503:
showAlert(title: "メンテナンス中です", message: "時間を開けて再度アクセスしてください")
default:
break
}
}
decisionHandler(.allow)
}
実際には、このままでは502のレスポンスがあるたびにsubviewが増えたり、その後リロード時に200で返ってもエラー用のViewが重なったままだったりと、調整しなければならない部分があります。
大事な部分は、navigationResponse.response as? HTTPURLResponse
のところですので、ここだけ抑えておけばよさそうです。このキャストをすることで、ステータスコードが取れるようになるので、番号に応じたカスタムビューを表示できるようになります。