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

Определить достижимость в фоновом режиме

Я тестировал другой способ реализовать возможность узнать, будет ли устройство возвращаться к Интернету, когда приложение находится в фоновом режиме, поэтому первым тестом, который я тестировал, был пример кода доступности Apple http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html

Но этот код не уведомляет интернет-состояние, когда приложение находится в фоновом режиме. Поэтому я попробовал и следующий код, и он работает, когда приложение запускается из состояния "Состояние" на передний план (то же, что и образец кода достижимости Apple).

- (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];

 ...
 }


 - (void)applicationDidEnterBackground:(UIApplication *)application {

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

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

}



- (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");

        //Alert sound in Background when App have internet again
        UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease];
        if (notification) {
            [notification setFireDate:[NSDate date]];
            [notification setTimeZone:[NSTimeZone defaultTimeZone]];
            [notification setRepeatInterval:0];
            [notification setSoundName:@"alarmsound.caf"];
            [notification setAlertBody:@"Send notification internet back"];
            [[UIApplication sharedApplication] scheduleLocalNotification:notification];
        }


        break;
    }
    case ReachableViaWWAN:
    {
        NSLog(@"The internet is working via WWAN!");


        //Alert sound in Background when App have internet again
        UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease];
        if (notification) {
            [notification setFireDate:[NSDate date]];
            [notification setTimeZone:[NSTimeZone defaultTimeZone]];
            [notification setRepeatInterval:0];
            [notification setSoundName:@"alarmsound.caf"];
            [notification setAlertBody:@"Send notification internet back"];
            [[UIApplication sharedApplication] scheduleLocalNotification:notification];
        }

        break;
    }
}
}

Мой вопрос:. Как получить уведомление, когда состояние Интернета изменилось, когда приложение находится в фоновом режиме?

4b9b3361

Ответ 1

Live вы не можете изменить, если сетевое подключение изменилось, самый лучший, который вы можете сделать, чтобы заставить его работать, - использовать Background Fetch режим от Capabilities. Сначала вы должны установить флажок для фонового режима: введите описание изображения здесь

Затем вам нужно запросить временной интервал так часто, как только вы можете, тем лучше, поэтому я предлагаю application:didFinishLaunchingWithOptions:, и вам нужно поместить эту строку:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    return YES;
}

UIApplicationBackgroundFetchIntervalMinimum это как можно чаще, но не точное количество секунд между выборками из документов:

Наименьший интервал выборки, поддерживаемый системой.

И затем, когда фоновая выборка выйдет, вы можете проверить AppDelegate с помощью метода:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    [reachability startNotifier];
    NetworkStatus status = [reachability currentReachabilityStatus];

    switch (status) {
        case NotReachable: {
            NSLog(@"no internet connection");
            break;
        }
        case ReachableViaWiFi: {
            NSLog(@"wifi");
            break;
        }
        case ReachableViaWWAN: {
            NSLog(@"cellurar");
            break;
        }
    }
    completionHandler(YES);
}

Все это будет работать в iOS 7.0 или выше.

Ответ 2

Я не верю, что есть способ получить уведомления о доступности, пока вы находитесь в фоновом режиме. Правильный способ справиться с этим - проверить доступность в приложении AppDelegate - (void) applicationWillEnterForeground: (UIApplication *).

Единственное фоновое событие, на которое реагируют фоновые приложения, это получение push-уведомлений, и это связано с тем, что ОС пробуждает их для этого, а затем только тогда, когда пользователь запрашивает его.

Ответ 3

Приложение должно быть многозадачным (VoIP, LOCATION или Audio). И таким образом вы можете поймать сеть, меняя ее, когда приложение находится в фоновом режиме.