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
}