2012-03-21 11 views
24

Sto utilizzando correttamente Raggiungibilità per determinare lo stato della rete e per ricevere notifiche delle modifiche (ad esempio Reachability Guide for iOS 4).Come ottenere notifiche di raggiungibilità in iOS in background quando si interrompe la rete Wi-Fi?

La mia domanda non è come ottenere Raggiungibilità e funzionamento, ma piuttosto quanto segue.

Il mio AppDelegate gestisce il materiale Raggiungibilità. L'app riceve notifiche (kReachabilityChangedNotification) mentre l'app è in esecuzione e quando l'app è in Background (applicationDidEnterBackground:).

L'app è progettata per ricaricare un flusso audio in riproduzione quando nota che ha perso una connessione Wi-Fi, ad es. Per testare, ho attivato e disattivato il Wi-Fi in Impostazioni e tutto ha funzionato perfettamente. Nei test del mondo reale, spesso perdo la connettività Wi-Fi quando esco dall'intervallo del punto di accesso. Ho trovato che la Raggiungibilità non mi sta aiutando troppo in questo caso. Non sono sicuro che sia perché le notifiche di Reachability non arrivano quando lo schermo è bloccato, o se Reaschability non gestisce la lenta diminuzione del segnale da un punto di accesso Wi-Fi sempre più distante, ma a prescindere non riesco a capire perché il test del mondo reale non corrisponde al caso idealizzato.

Ecco come appare il mio codice. Ho messo per ricevere le notifiche, e iniziare ad ascoltare raggiungibilità:

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

e poi, questa è la funzione che risponde alle variazioni di connettività:

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

Le notifiche vengono attraverso anche quando l'applicazione è in background, ma non nel test del mondo reale descritto sopra.

Grazie per qualsiasi aiuto.

+0

Hai provato una combinazione di 'reachabilityForInternetConnection' e' reachabilityForLocalWifi'? –

+0

Hai trovato una soluzione per questo? Sto vivendo un problema simile, e le soluzioni qui non sembrano aiutare o non sono quello che sto cercando. – newenglander

+0

Non so di aver mai risolto il mio problema specifico, dato che ultimamente non ho avuto bisogno di lavorare su quel progetto. Ti sei assicurato che l'app sia in esecuzione in background con un'attività in background, secondo la raccomandazione di @ Hurden? –

risposta

5

Per impostazione predefinita nell'app dello stato in background rimane solo per un breve periodo di tempo, la maggior parte delle app passa allo stato sospeso poco dopo. Ciò significa che l'app è in background ma non sta eseguendo il codice. Quindi le notifiche personalizzate implementate non funzionano. Deve requery NetworkReachability a ora di ripristino in App methodes delegato:

applicationWillEnterForeground: 
applicationDidBecomeActive 
1

stavo lavorando su un'applicazione VoIP, che viene lanciato in background quando gli stivali iPhone fino, a quel punto ci potrebbe essere alcun raggiungibilità di rete (ad esempio, se il telefono ha sia un passcode e/o una scheda SIM con un codice PIN). Ma poiché l'app viene avviata direttamente in background, il metodo delegato applicationDidEnterBackground: non viene chiamato. Invece quello che ho fatto è stato usare l'idea di @Hurden direttamente in application:didFinishLaunchingWithOptions, controllando lo applicationState per vedere se l'app stava effettivamente iniziando in background. Ciò ha permesso alla mia app di ricevere la notifica kReachabilityChangedNotification dopo che il telefono era stato sbloccato (abilitando il WiFi a connettersi utilizzando la password memorizzata).

Problemi correlati