如何使用Reachability检查服务器是否可用

时间:2018-03-23 20:32:30

标签: ios objective-c wkwebview reachability

我试图弄清楚如何最好地确定iOS中是否有可用的页面。我有一个可以看到URL请求代码的WKWebView,它适用于404,500等。但是,当目标URL的服务器可能无法确定如何处理对URL的请求时沮丧我的WKWebView开始导航委托方法触发,然后什么都没有。我的网络请求似乎消失了。

例如,Chrome会返回一条消息,说明"无法访问此网站 无法找到chess.math.science.google.com的服务器IP地址。"

我在didStartProvisionalNavigation委托方法中包含了iOS Reachability类,并且说该URL应该可以通过WIFI访问,虽然不是错误的,但不会检查URL是否有任何要返回的内容。

App Log:

2018-03-23 16:28:54.142105-0400 MyApp[1245:774884] INTERNET REACHABLE
2018-03-23 16:28:54.272582-0400 MyApp[1245:774884] WKWEBVIEW DID START NAVIGATION
2018-03-23 16:28:54.274085-0400 MyApp[1245:774884] NETWORK STATUS FOR URL chess.math.science.google.com: 2
(lldb) po netStatus
ReachableViaWiFi

代码:

-(void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
    NSLog(@"WKWEBVIEW DID START NAVIGATION");
     Reachability* tinyReach = [Reachability reachabilityWithHostname:webView.URL.absoluteString];
    NetworkStatus netStatus = [tinyReach currentReachabilityStatus];
    NSLog(@"NETWORK STATUS FOR URL %@: %li", webView.URL.absoluteString, netStatus);
    if(netStatus == NotReachable) {
        NSLog(@"NOT REACHABLE");

1 个答案:

答案 0 :(得分:0)

您需要实现WKNavigationDelegate的webView:didFailProvisionalNavigation:withError:方法。 (参见https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455637-webview?language=objc)然后在Web视图中设置您的代理:

self.webView.navigationDelegate = myDelegate; // maybe self

此方法报告网络错误,包括超时错误和DNS解析错误。它们通常有一个error.domain = NSURLErrorDomain(NSString)和来自NSURLErrorDomain枚举的error.code。

例如,如果服务器由于某种原因没有响应60秒,您将获得NSURLErrorTimedOut,还有许多其他可能的错误,如NSURLErrorCannotConnectToHost和NSURLErrorNotConnectedToInternet。 The list is here或NSURLError.h标题。

P.S。 Reachability API更适合暗示用户可能出错,而不是将其作为事实的主要来源。它总是更好(并且由Apple工程师提供建议)尝试运行请求并获得真正的错误,而不是依赖于某些可达性指示。