Domanda

Il mio iphone app è abbastanza semplice, con un punto di vista che si occupa di tutto, sotto controllo viewDidLoad ho per vedere se abbiamo una connessione internet e se lo facciamo caricate dal web e se non carichiamo da una risorsa locale. E questo funziona bene.

//in viewDidOnload    
[[NSNotificationCenter defaultCenter] addObserver:self 
                                          selector:@selector(handleNetworkChange:) 
                                          name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];

if (status == NotReachable) {
    //Do something offline
} else {
    //Do sometihng on line
}

- (void)handleNetworkChange:(NSNotification *)notice{
 NetworkStatus status = [reachability currentReachabilityStatus];
 if (status == NotReachable) {
  //Change to offline Message
 } else {
  //Relaunch online application
 }

}

Per testare il mio evento handleNetworkChange ho spento tutti i dati cellulari, ma lasciato il wifi. Nel raggio di comunicazione WIFI ho iniziato l'applicazione e tutto funziona perfetto. Poi io cammino al di fuori della portata del Wi-Fi, ma il mio handleNetworkChange mai incendi (testato utilizzando un UIAlertView). In piedi al di fuori degli anni wifi varia miei lanci app il messaggio non in linea bene.

Il mio sospetto è che si tratta di un problema con il ciclo di vita del ViewController, questo dovrebbe essere collocato il codice nella funzione AppDelegate? Forse questo è un progetto migliore per iniziare.

È stato utile?

Soluzione

Abbiamo scoperto che era un problema di gestione della memoria, come io non stavo mantenendo la variabile raggiungibilità, quindi non appena sarebbe andare fuori del campo di applicazione della dealloc sarebbe chiamato e che ha chiamato il metodo stopNotifier. Quindi nessun aggiornamenti, avrei camminato fuori campo.

Così, invece di:

reachability = [Reachability reachabilityForInternetConnection];

I fare

reachability = [[Reachability reachabilityForInternetConnection] retain];

e tutto funziona!

Una fresco cosa che ho imparato in tutto questo è che si può simulare una connessione persa nel simulatore semplicemente ruotando Aeroporto Off. Non sarà più necessario andare in giro al di fuori. :)

Altri suggerimenti

Date un'occhiata all'esempio raggiungibilità da parte di Apple. Credo che iniziano le loro notifiche nel AppDelegate. In una delle mie applicazioni, ho creato una variabile booleana che viene costantemente aggiornato dal metodo di aggiornamento connettività AppDelegate così nei miei altri controller di vista, ho solo bisogno di chiamare il delegato e verificare il valore del bool IsConnected.

Solo per attraverso un altro pensiero in qui ... ho problemi notato con la classe di raggiungibilità in cui si può congelare la vostra applicazione quando il vostro controllo per raggiungibilità. Nelle mie nuove app, mi salta la classe raggiungibilità del tutto e piuttosto trasmettere sui metodi delegato DidFail per NSURLConnection e UIWebView per determinare se ho una vera connettività. Non ho più aspettare per la classe raggiungibilità di capirlo e non riescono per me poi decidere cosa fare, ho semplicemente procedere con la chiamata web e utilizzare il locale come un back caduta.

Spero che questo aiuti !!

Si dovrebbe includere systemconfiguration.framework al tuo progetto.

L'applicazione non è in esecuzione in background.

Si prega di aggiungere questo metodo nella classe delegato

- (void)applicationDidEnterBackground:(UIApplication *)application
{ UIApplication* app = [UIApplication sharedApplication];

    UIBackgroundTaskIdentifier __block bgTask = [app beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        });
    }];

}

Grazie

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top