Я использую предоставленный Apple пример кода для мониторинга Reachability, но это все еще вызывает у меня головную боль. Я работаю на iOS 5, кстати.
// Initialise
hostReach = [[Reachability reachabilityForInternetConnection] retain];
[hostReach startNotifier];
и
-(void) updateConnectionStatus
{
// Check Internet connectivity
NetworkStatus netStatus = [hostReach currentReachabilityStatus];
if(netStatus == NotReachable)
{
NSLog (@"updateConnectionStatus: network not reachable!");
[self setNetworkAvailable:NO];
}
else
{
NSLog (@"updateConnectionStatus: network reachable!");
[self setNetworkAvailable:YES];
}
}
, а также
//Called by Reachability whenever status changes.
- (void) reachabilityChanged: (NSNotification *) note
{
NSLog (@"reachabilityChanged");
[self updateConnectionStatus];
}
не забывая,
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog (@"applicationWillEnterForeground");
[self updateConnectionStatus];
}
Я использовал это некоторое время, но хочу обработать достижимость в приложении нетривиальным способом, например, используя кэшированные данные, когда сеть недоступна.
Первая проблема заключается в том, что уведомление об изменении статуса не приходит примерно до 10-й секунды после того, как приложение выходит на передний план, и даже не проверяется вручную, когда приложение вновь выходит на передний план (как показано выше) возвращает неверный результат. Смотрите этот пример журнала из консоли,
2012-02-01 13:31:02.566 myapp[9807:707] applicationWillEnterForeground
2012-02-01 13:31:02.632 myapp[9807:707] Reachability Flag Status: -- ------- networkStatusForFlags
2012-02-01 13:31:02.634 myapp[9807:707] updateConnectionStatus: network not reachable!
2012-02-01 13:31:02.660 myapp[9807:707] reachabilityChanged
2012-02-01 13:31:02.662 myapp[9807:707] Reachability Flag Status: WR t----l- networkStatusForFlags
2012-02-01 13:31:02.663 myapp[9807:707] updateConnectionStatus: network reachable!
Я пробовал оба,
hostReach = [[Reachability reachabilityWithHostName:@"www.apple.com"] retain];
и
hostReach = [[Reachability reachabilityForInternetConnection] retain];
Это означает, что если сеть была недоступна во время последнего запуска приложения, восстановление будет менее эффективным, чем при повторном запуске приложения с сетевым подключением.
Неужели эта задержка неизбежна?
Другая проблема заключается в том, что мое приложение, по-видимому, иногда не получает эти уведомления. Похоже, это происходит, когда мое приложение некоторое время находилось в фоновом режиме, хотя я не могу воссоздать его по своему желанию.
Но иногда, когда я возвращаюсь к приложению, последнее уведомление, которое оно получало, было о том, что сеть была недоступна, и она, очевидно, никогда не видит уведомление о достижимости сети: - (
Кто-нибудь еще видел что-нибудь подобное?
Спасибо.