2012-03-21 9 views
24

Estoy usando Reachability correctamente para determinar el estado de la red y recibir notificaciones de cambios (por ejemplo, Reachability Guide for iOS 4).Cómo obtener notificaciones de accesibilidad en iOS en el fondo cuando se cae la red Wi-Fi?

Mi pregunta no es cómo poner en funcionamiento Reachability, sino más bien lo siguiente.

Mi AppDelegate maneja las cosas de Accesibilidad. La aplicación recibe notificaciones (kReachabilityChangedNotification) mientras se ejecuta la aplicación y cuando la aplicación está en segundo plano (applicationDidEnterBackground:).

La aplicación está diseñada para volver a cargar una transmisión de audio reproducida cuando nota que ha perdido una conexión Wi-Fi, p. Para probar, activé y desactivé el Wi-Fi en Configuración, y todo funcionó perfectamente. En las pruebas del mundo real, a menudo pierdo conectividad Wi-Fi cuando salgo del rango del punto de acceso. He descubierto que Alcachability no me está ayudando demasiado en este caso. No estoy seguro de si se debe a que las notificaciones de Accesibilidad no aparecen cuando la pantalla está bloqueada, o si la Accesibilidad no maneja la disminución lenta de la señal desde un punto de acceso Wi-Fi cada vez más distante, pero independientemente de lo que pueda entender por qué las pruebas del mundo real no coinciden con el caso idealizado.

Así es como se ve mi código. La primera vez que ha configurado para recibir notificaciones, y empezar a escuchar a asequibilidad:

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

y luego, esta es la función que responde a los cambios en la conectividad:

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

Las notificaciones llegan a través incluso cuando la aplicación está en el fondo, pero no en la prueba del mundo real descrita anteriormente.

Gracias por cualquier ayuda.

+0

¿Has probado una combinación de 'reachabilityForInternetConnection' y' reachabilityForLocalWifi'? –

+0

¿Encontró una solución para esto? Estoy experimentando un problema similar, y las soluciones aquí no parecen ayudar o no son lo que estoy buscando. – newenglander

+0

No sé si alguna vez resolví mi problema específico, ya que no he necesitado trabajar en ese proyecto últimamente. ¿Se ha asegurado de que la aplicación se ejecute en segundo plano con una tarea en segundo plano, según la recomendación de @ Hurden? –

Respuesta

5

De forma predeterminada, en la aplicación de estado de fondo se mantiene durante un tiempo corto, la mayoría de las aplicaciones pasan al estado suspendido poco después. Eso significa que la aplicación está en segundo plano pero no está ejecutando código. Por lo tanto, su notificación implementada personalizada no funciona. Debe volver a consultar NetworkReachability al despertador Tiempo en methodes delegado de la aplicación:

applicationWillEnterForeground: 
applicationDidBecomeActive 
1

yo estaba trabajando en una aplicación de VoIP, que se puso en marcha en el fondo cuando se inicia el iPhone hasta, momento en el cual podría no haber accesibilidad de la red (por ejemplo, si el teléfono tiene un código de acceso y/o una tarjeta SIM con un código PIN). Pero dado que la aplicación se inicia directamente en segundo plano, no se llama al método delegado applicationDidEnterBackground:. En cambio, lo que hice fue utilizar la idea de @ Hurden directamente en application:didFinishLaunchingWithOptions, verificando applicationState para ver si la aplicación realmente se estaba iniciando en segundo plano. Esto permitió que mi aplicación recibiera la notificación kReachabilityChangedNotification después de que el teléfono se desbloqueara (lo que permite que la WiFi se conecte usando la contraseña almacenada).

Cuestiones relacionadas