Apple的名为Reachability的示例应用程序显示了如何检测连接。如果你只有wifi而不是互联网,应用程序在下面的第二行停止超过一分钟:
SCNetworkReachabilityFlags reachabilityFlags;
BOOL gotFlags = SCNetworkReachabilityGetFlags(reachabilityRef, &reachabilityFlags);
SCNetworkReachabilityGetFlags来自SystemConfiguration.framework。关于如何解决这个问题的任何建议?
答案 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秒。
其他一些注意事项: