【问题标题】:How do I detect real network availability?如何检测真实的网络可用性?
【发布时间】:2010-10-12 07:54:39
【问题描述】:

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

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

【问题讨论】:

  • 没有简单的方法来查看是路由器、服务器还是它们之间的任何站不工作。

标签: iphone networking ios


【解决方案1】:

你可以这样做:

+ (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,这样您就不会下载整个资源。

【讨论】:

  • 感谢您的回复,这帮助我解决了这个问题,对您提供的方法做了一些修改。
【解决方案2】:

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

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

查看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。

或者至少可以访问这个服务器,在这个例子中是微软。

【讨论】:

    【解决方案3】:

    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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多