WKWebViewでインターネット接続エラーを取得する

調べてもSystemconfigurationを使った解決法しか見つかりませんでしたがWKWebViewを使っている場合SystemConfirugationを使わなくてもオフラインである状態を取得することができます。

WKWebViewでエラーを判定する方法

errorをNSErrorにキャストするとcodeが確認できるようになる。

codeの値が1009だった場合インターネット接続がない!!!!!

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        let e = error as NSError

        if e.code == -1009 {
            print("NotConnectedToInternet")
        }
    }

NSErrorのステータスコードについて

このサイトにわかりやすく日本語約してくれているステータスコード一覧がまとめてありました!ありがたい.

【Swift】NSCocoaErrorDomainのNSError Codes一覧

私がWKWebViewでwebPageをいじっていた際に飛んできたerrorはこの2つでした。

NSURLErrorCancelled = -999 // ロードがキャンセルされた
NSURLErrorAppTransportSecurityRequiresSecureConnection = -1022 // ATS(App Transport Security)が必要である
NSURLErrorNotConnectedToInternet = -1009 // インターネット未接続だった

SystemConfigurationを使った方法

おまけでSystemConfigurationを使った方法も載せておきます。WKWebViewを使うのであれば必要ないと思います。

ios reachability 使い方 – Swiftとのインターネット接続を確認する

 import SystemConfiguration
 
 〜〜〜省略
 
 private func isConnectedToNetwork() -> Bool {
        var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
        zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
            }
        }

        var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
        if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
            return false
        }
        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
        let ret = (isReachable && !needsConnection)

        return ret
    }