すっさんぽ
  1. Posts/

WKWebView サーバからのステータスコードのとり方

·

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 のところですので、ここだけ抑えておけばよさそうです。このキャストをすることで、ステータスコードが取れるようになるので、番号に応じたカスタムビューを表示できるようになります。