苹果公司名为Reachability的示例应用程序展示了如何检测连接。如果您只有wifi上网,但没有互联网,则该应用会在下面的第二行中暂停一分钟以上:

SCNetworkReachabilityFlags reachabilityFlags;
BOOL gotFlags = SCNetworkReachabilityGetFlags(reachabilityRef, &reachabilityFlags);

SCNetworkReachabilityGetFlags来自SystemConfiguration.framework。关于如何解决这个问题的任何建议?

最佳答案

要直接回答您的问题,不,似乎没有任何方法可以解决您所描述的特定情况下需要花费很长时间才能返回的SCNetworkReachabilityGetFlags()(例如,通过与路由器的WiFi连接检查远程主机的可达性)没有互联网)。有两种选择:

选项1.在一个单独的线程中进行调用,以便您的应用程序的其余部分可以继续运行。修改ReachabilityAppDelegate.m为示例,如下所示:

// Modified version of existing "updateStatus" method
- (void)updateStatus
{
    // Query the SystemConfiguration framework for the state of the device's network connections.
    //self.remoteHostStatus           = [[Reachability sharedReachability] remoteHostStatus];
    self.remoteHostStatus = -1;
    self.internetConnectionStatus   = [[Reachability sharedReachability] internetConnectionStatus];
    self.localWiFiConnectionStatus  = [[Reachability sharedReachability] localWiFiConnectionStatus];
    [tableView reloadData];

    // Check remote host status in a separate thread so that the UI won't hang
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSTimer *timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(updateRemoteHostStatus) userInfo:nil repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [pool release];
}
// New method
- (void) updateRemoteHostStatus
{
    self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];
    [tableView reloadData];
}

选项2.尝试连接到远程主机时,请使用其他使用超时值的API/函数。这样一来,您的应用在放弃之前仅会挂起X秒钟。

其他注意事项:
  • 您要查询的对SCNetworkReachabilityGetFlags()的特定调用(即Reachability.m中的〜399行)试图查看www.apple.com是否“可达”,以推断“外部互联网”是否“可达” “一般来说。
  • 在Apple的System Config框架中,“reachable”可能并不意味着您认为的那样。根据官方文档,“可达”似乎意味着,从理论上讲,您的计算机可以连接到主机X,但实际上可能需要先建立连接(例如,先拨打调制解调器)。换句话说,SCNetworkReachabilityGetFlags()实际上并未建立连接。
  • 关于iphone - 可达性示例应用程序为何在这里停滞?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/723463/

    10-10 22:36