如何使用iPhone的可达性代码查找服务器是否可达?

6


我有一个客户端服务器,例如“http://abc.com”,我想检查这个服务器是否响应。
如何使用苹果公司的Reachability代码进行检查?
我看到了那段代码,但不知道在哪里写入我的客户端URL以进行检查。
请给我建议。

2个回答

9
这是一个同步的例子。你可能希望异步执行,但这个例子可以快速检查。
Reachability *netReach = [Reachability reachabilityWithHostName:@"host.name"];
//return [netReach currentReachabilityStatus];
NetworkStatus netStatus = [netReach currentReachabilityStatus];
if (netStatus==ReachableViaWiFi) {
    [ViewManager showStatus:@"Reachable (WiFi)!"];
} else if(netStatus==ReachableViaWWAN) {
    [ViewManager showStatus:@"Reachable (WWAN)!"];
} else {
    [ViewManager showStatus:@"Not reachable, aww :-("];
}

使用reachabilityWithHostName时,请记住这只是主机名,不应该有http://前缀或类似的内容。

我想强调一下,在某些情况下,上面的示例可能会阻塞主线程很长时间。 - Toydor
@Toydor 是的,确实如此,因此请注意他们可能希望异步执行 :) - Rudi Visser
这段代码无法运行,因为苹果的主机可达性并不是你所想象的那样工作。它只检查到路由器的第一跳是否可达。如果可达,它就报告可达,而不管实际的主机是否存活和响应,甚至处于失效状态。 - occulus
@occulus 感谢您的投票,但是根据问题中对“reachability”框架使用示例的定义和请求,它确实可以做到我们认为它可以做到的。它不会检查另一端是否响应,但它将检查a)主机是否可通过名称解析,并且b)基于网络配置,是否有可用接口向该主机传输数据包。 - Rudi Visser
我不同意。问题是:“我想检查服务器是否响应。如何使用苹果的Reachability代码进行检查?”答案是“你不能”。 此外,讽刺并不有益。 - occulus

0
为了通过 Apple(Reachability)代码检查您的服务器是否可达,您需要查看其实用程序方法,如下所示:
+ (Reachability*) reachabilityWithHostName: (NSString*) hostName;

但是在我看来,我会首先检查其他因素的可达性(检查互联网连接3G / Edge / Wifi,然后验证所需主机是否可达)在同一实例中。这只是我的情况下更新可达性方法中的一个安全检查。

 else if (((netStatus == ReachableViaWiFi) || (netStatus == ReachableViaWWAN)) && connectionRequired == YES)
 {
       isInternetConAvailable = ([[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:kReachibility_ping_uri] 
                                                          cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0] delegate:self]) ? YES : NO;
 }

其中'kReachibility_ping_uri'是包含主机名的常量,当iPhone客户端的可达性发生变化时,可达性类将发布通知'kReachabilityChangedNotification',同时您必须执行所有可达性检查并更新您的可达性状态。

如果您需要示例,请告诉我,我会提供代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接