Как получать уведомления о доступности в iOS в фоновом режиме при отключении сети Wi-Fi?

Я успешно использую Reachability для определения состояния сети и получения уведомлений об изменениях (например, Руководство по Reachability для iOS 4).

Мой вопрос не в том, как запустить Reachability, а в следующем.

Мой AppDelegateотвечает за доступность. Приложение получает уведомления ( kReachabilityChangedNotification) во время работы и в фоновом режиме ( applicationDidEnterBackground:).

Приложение предназначено для перезагрузки воспроизводимого аудиопотока, когда оно замечает потерю соединения Wi-Fi, например. Для проверки я включал и выключал Wi-Fi в настройках, и все работало отлично.При тестировании в реальных условиях я часто терял подключение к Wi-Fi, когда выходил за пределы зоны действия точки доступа. Я обнаружил, что Reachability не слишком помогает мне в этом случае. Я не уверен, связано ли это с тем, что уведомления Reachability не приходят, когда экран заблокирован, или с тем, что Reachability не справляется с медленным уменьшением сигнала от все более удаленной точки доступа Wi-Fi, но тем не менее я не могу понять почему реальное тестирование не соответствует идеализированному случаю.

Вот как выглядит мой код. Сначала я настраиваю получение уведомлений и начинаю слушать Reachability:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(checkNetworkStatus:) 
                                                 name:kReachabilityChangedNotification object:nil];

    // Set up Reachability
    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];    

    ....

    return YES;
}

, а затем это функция, которая реагирует на изменения в подключении:

- (void)checkNetworkStatus:(NSNotification *)notice {
    // called after network status changes

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI");
            break;            
        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN!");
            break;            
        }
    }    
}

Уведомления приходят, даже когда приложение находится в фоновом режиме, но они не не в реальном тестировании, описанном выше.

Спасибо за любую помощь.

24
задан Community 23 May 2017 в 12:29
поделиться