Чтобы ответить на ваш вопрос напрямую, нет, похоже, нет никакого способа «обойти» 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 (), о котором вы спрашиваете (т. Е. Строка ~ 399 в Reachability.m), пытается выяснить, является ли сайт www.apple.com «достижимым» для определения, если «внешний интернет» "достижимо" в общем.
- В платформе Apple System Config «достижимость» может не означать, что вы думаете, что она делает. Согласно официальным документам, «достижимость», по-видимому, означает, что, теоретически, ваш компьютер мог бы подключиться к хосту X, если бы захотел, но, возможно, сначала потребуется установить соединение (например, сначала набрать модем). Другими словами, SCNetworkReachabilityGetFlags () фактически не устанавливает соединение.