Как получить уведомления о доступности в iOS в фоновом режиме при отбрасывании сети Wi-Fi? - PullRequest
24 голосов
/ 21 марта 2012

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

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

Мой AppDelegate обрабатывает вещи Reachability. Приложение получает уведомления (kReachabilityChangedNotification) как во время работы приложения, так и когда приложение находится в фоновом режиме (applicationDidEnterBackground:).

Приложение предназначено для перезагрузки воспроизводимого аудиопотока, когда оно замечает, что потеряно соединение Wi-Fi, например Чтобы проверить, я включил и выключил Wi-Fi в настройках, и все работало отлично. В реальных испытаниях я часто теряю подключение к Wi-Fi, когда выхожу из зоны доступа. Я обнаружил, что в этом случае 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;            
        }
    }    
}

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

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

Ответы [ 2 ]

5 голосов
/ 25 октября 2012

По умолчанию в фоновом режиме приложение остается только на короткое время, большинство приложений переходят в приостановленное состояние вскоре после этого. Это означает, что приложение находится в фоновом режиме, но не выполняет код. Так что ваши пользовательские уведомления не работают. Необходимо запросить NetworkReachability во время пробуждения в методах делегата приложения:

applicationWillEnterForeground:
applicationDidBecomeActive 
1 голос
/ 14 октября 2013

Я работал над приложением VoIP, которое запускается в фоновом режиме при загрузке iPhone, и в этот момент сеть может быть недоступна (например, если у телефона есть и код доступа, и / или SIM-карта с PIN-кодом).код).Но поскольку приложение запускается непосредственно в фоновом режиме, метод делегата applicationDidEnterBackground: не вызывается.Вместо этого я использовал идею @ Hurden непосредственно в application:didFinishLaunchingWithOptions, проверив applicationState, чтобы увидеть, действительно ли приложение запускалось в фоновом режиме.Это позволило моему приложению получать уведомление kReachabilityChangedNotification после того, как телефон был разблокирован (что позволяет Wi-Fi подключаться с использованием сохраненного пароля).

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