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

时间:2010-10-12 07:54:40

标签: iphone networking ios

当iPhone连接到无线路由器时,该路由器未连接到互联网?我需要显示一条错误消息,说“检查你的互联网连接”我试过Reachability示例代码。但没有运气, http://developer.apple.com/library/ios/#samplecode/Reachability/Listings/ReadMe_txt.html

当我在手机中禁用WIFI时,它工作正常,我尝试了Checking For Internet Connectivity in Objective C示例代码“isDataSourceAvailable”即使它不起作用,任何人都可以帮我解决这个问题,真的很适合。

3 个答案:

答案 0 :(得分: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,这样您就不会下载整个资源。

答案 1 :(得分:1)

我建议你像微软那样做,并且真的很邪恶,你甚至可以使用他们的服务器,因为他们可能会确保这些服务器在可预见的未来都在线。

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

请参阅same question on 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"

然后等待回归。如果有任何返回,即使是单个字节,也意味着您可以访问Internet。

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

答案 2 :(得分:0)

https://github.com/adib/asi-http-request/blob/master/External/Reachability/Reachability.h

这是git上ASI HTTPRequest项目的一部分。它扩展了Apple的例子,显然对于商店中的不少应用来说已经足够了(参见ASI的使用者墙:http://allseeing-i.com/ASIHTTPRequest/Who-is-using-it

Anywho,我知道答案已被接受,但仅供进一步参考。