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