ios multithreading swift background reachability

ios - Detectar la accesibilidad en el fondo.



multithreading swift (3)

No creo que haya una manera de recibir notificaciones de accesibilidad mientras estás en segundo plano. La forma correcta de manejar esto sería verificar la accesibilidad en la aplicación AppDelegate - (void )WillEnterForeground: (UIApplication *).

El único evento en segundo plano al que las aplicaciones en segundo plano reaccionan es la recepción de notificaciones push, y esto se debe a que el sistema operativo las reactiva para hacerlo, y solo cuando el usuario lo solicita.

He estado probando diferentes maneras de implementar la posibilidad de saber si el dispositivo recupera internet cuando la aplicación está en segundo plano, por lo que el primer código que probé fue el código de ejemplo de accesibilidad de Apple http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html

Pero este código no notifica el estado de Internet cuando la aplicación está en segundo plano. Así que también probé el siguiente código y funciona cuando la aplicación se inicia desde el estado de fondo a primer plano (igual que el código de ejemplo de accesibilidad de 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; } } }

Mi pregunta es: ¿Cuál es la forma de recibir una notificación cuando el estado de Internet cambia cuando la aplicación está en segundo plano?


Su aplicación debe ser multitarea (VoIP, UBICACIÓN o Audio). Y de esta manera, puede detectar la red cambiando cuando la aplicación está en segundo plano.


Live no se puede cambiar si la conexión de red cambia, lo mejor que puede hacer para que funcione es usar el modo Background Fetch de Capabilities . Primero debe marcar la casilla de verificación para el modo de fondo:

Luego, debe solicitar el intervalo de tiempo con la mayor frecuencia posible, cuanto antes mejor, así que sugiero la application:didFinishLaunchingWithOptions: y debe poner esta línea:

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

El UIApplicationBackgroundFetchIntervalMinimum es tan a menudo como sea posible, pero no es el número exacto de segundos entre las recuperaciones de los documentos:

El intervalo de recuperación más pequeño admitido por el sistema.

Y luego, cuando se recupere el fondo, puede verificar en AppDelegate con el método:

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

Todo esto funcionará en iOS 7.0 o superior.