Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

applicationWillEnterForeground:
applicationDidBecomeActive 

Ответ 2

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