如何检测真实的网络可用性?

7
当iPhone连接到无线路由器时,如果该路由器未连接到互联网,则需要显示一个错误消息,提示“检查您的互联网连接”。我尝试过Reachability示例代码,但没有成功。http://developer.apple.com/library/ios/#samplecode/Reachability/Listings/ReadMe_txt.html 当我在手机上禁用WIFI时,它可以正常工作。我尝试了Checking For Internet Connectivity in Objective C示例代码中的“isDataSourceAvailable”,但仍然不能正常工作。请问有谁能帮我解决这个问题?非常感谢。

没有简单的方法可以确定是路由器、服务器还是它们之间的任何站点出现问题。 - Eiko
3个回答

10
你可以像这样做:
+ (BOOL) pingServer
{
    NSURL *url = [NSURL URLWithString:@"http://some-url-that-has-to-work/"];
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    NSHTTPURLResponse *response = nil;
    [NSURLConnection sendSynchronousRequest:request
        returningResponse:&response error:NULL];
    return (response != nil);
}

这是一个同步请求,会阻塞当前线程。您可以在后台线程中完成整个网络检查,以便阻塞不重要,或者您可以异步发送请求。此外,您可能需要将HTTP方法设置为HEAD,以便不下载整个资源。


谢谢回复,这帮助我修复了问题,我对您提供的方法进行了一些修改。 - Sam

1

我建议您像微软一样做,甚至可以使用他们的服务器,因为他们可能会确保这些服务器在可预见的未来在线。

他们查找主机名,然后访问Web服务器上的一个非常小的文件。

请参见serverfault上相同的问题(当然是从非编程角度考虑)。

基本上,查找主机名的IP地址(在该示例中为"dns.msftncsi.com"),然后访问URL,例如http://msftncsi.com/ncsi.txt。如果您愿意,可以使用简单的套接字编程来完成此操作,不需要真正的HTTP。

打开到您通过查找主机名找到的IP的80端口的套接字。 向套接字发送字符串,如下所示:

"GET /msftncsi.com/ncsi.txt HTTP/1.1\nHost: msftncsi.com:80\n\n"

然后等待某些返回。如果有任何返回,即使是一个字节,这意味着您可以访问互联网。

或者至少可以访问此服务器,在此示例中为Microsoft。


0

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