¿Cómo get notifications de accesibilidad en iOS en segundo plano al eliminar la networking Wi-Fi?

Estoy usando Reachability con éxito para determinar el estado de la networking, y para ser notificado de los cambios (por ejemplo, Reachability Guide para iOS 4 ).

Mi pregunta no es cómo lograr que Reachability esté funcionando, sino más bien lo siguiente.

Mi AppDelegate maneja las cosas de Reachability. La aplicación recibe notifications ( kReachabilityChangedNotification ) mientras la aplicación se está ejecutando y cuando la aplicación está en Background ( applicationDidEnterBackground: kReachabilityChangedNotification .

La aplicación está diseñada para recargar una secuencia de audio de reproducción cuando se da count de que ha perdido una connection Wi-Fi, por ejemplo, para probar, activé y desactivé Wi-Fi en Configuración, y todo funcionó perfectamente. En las testings del mundo real, a menudo pierdo conectividad Wi-Fi cuando salgo del scope del punto de acceso. Descubrí que Reachability no me está ayudando demasiado en este caso. No estoy seguro si es porque las notifications de scope no aparecen cuando la pantalla está bloqueada o si Reachability no maneja la lenta disminución de la señal de un punto de acceso Wi-Fi cada vez más distante, pero a pesar de todo no puedo calcular por qué las testings del mundo real no constringn con el caso idealizado.

Esto es como se ve mi código. La primera vez que me configuré para recibir notifications, y comenzar a escuchar 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; } 

y luego, esta es la function 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 notifications llegan incluso cuando la aplicación está en segundo plano, pero no en las testings del mundo real descritas anteriormente.

Gracias por cualquier ayuda.

De forma pnetworkingeterminada, la aplicación de estado de background se queda solo por un corto time, la mayoría de las aplicaciones se mueven al estado suspendido poco después. Eso significa que la aplicación está en segundo plano pero no ejecuta el código. Entonces, su notificación personalizada implementada no funciona. Debe consultar NetworkReachability en Wakeup Time en los methods de delegado de la aplicación:

 applicationWillEnterForeground: applicationDidBecomeActive 

Estaba trabajando en una aplicación de VoIP, que se inicia en segundo plano cuando el iPhone arranca, y en ese momento puede que no haya acceso a la networking (por ejemplo, si el teléfono tiene una contraseña o una tarjeta SIM con un código PIN). Pero como la aplicación se inicia directamente en segundo plano, no se invoca el método delegado applicationDidEnterBackground: no se llama. En cambio, lo que hice fue utilizar la idea de @ Hurden directamente en la application:didFinishLaunchingWithOptions , comprobando el estado de la applicationState para ver si la aplicación realmente estaba comenzando en segundo plano. Esto permitió que mi aplicación obtuviera la notificación kReachabilityChangedNotification después de que el teléfono se desbloqueó (habilitando que WiFi se conecte usando la contraseña almacenada).