Доступность iOS - проблемы с медленными и отсутствующими уведомлениями - PullRequest
4 голосов
/ 01 февраля 2012

Я использую предоставленный 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];

Это означает, что если сеть была недоступна во время последнего запуска приложения, восстановление будет менее эффективным, чем при повторном запуске приложения с сетевым подключением.

Неужели эта задержка неизбежна?

Другая проблема заключается в том, что мое приложение, по-видимому, иногда не получает эти уведомления. Похоже, это происходит, когда мое приложение некоторое время находилось в фоновом режиме, хотя я не могу воссоздать его по своему желанию.

Но иногда, когда я возвращаюсь к приложению, последнее уведомление, которое оно получало, было о том, что сеть была недоступна, и она, очевидно, никогда не видит уведомление о достижимости сети: - (

Кто-нибудь еще видел что-нибудь подобное?

Спасибо.

1 Ответ

0 голосов
/ 10 февраля 2012

Чтобы ответить на мой собственный вопрос, вызов updateConnectionStatus в отдельном потоке, похоже, устранил проблему (кажется, более надежно возвращает правильный статус), хотя, если честно, я не уверен, почему.

Отложенные уведомления остаются неприятностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...