为什么Reachability样本应用程序停在这里?

时间:2009-04-06 22:14:29

标签: iphone objective-c

Apple的名为Reachability的示例应用程序显示了如何检测连接。如果你只有wifi而不是互联网,应用程序在下面的第二行停止超过一分钟:

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

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

1 个答案:

答案 0 :(得分:6)

直接回答你的问题,不,似乎没有办法“绕过”SCNetworkReachabilityGetFlags()需要很长时间才能在你描述的特定情况下返回(例如,通过WiFi连接检查远程主机可达性)到没有Internet的路由器)。有两种选择:

选项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框架中,“可达”可能并不意味着您的想法。根据官方文档,“可达”似乎意味着,理论上,如果计算机可以连接到主机X,但它可能需要首先实际建立连接(例如,首先拨打调制解调器)。换句话说,SCNetworkReachabilityGetFlags()实际上并不建立连接。