Frage

Mein iphone app ist ziemlich einfach mit einem Blick, dass Griffe alles, in viewDidLoad ich überprüfen, ob wir eine Internetverbindung haben, und wenn wir uns von der Bahn nicht laden und wenn wir nicht von einer lokalen Ressource laden. Und das funktioniert gut.

//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
 }

}

Zu meiner handleNetworkChange Ereignis teste ich Sie alle Handy-Daten gedreht, sondern verließ die Wi-Fi auf. Innerhalb der Reichweite der Wi-Fi begann ich den App und alles funktioniert perfekt. Dann gehe ich außerhalb der Reichweite des Wi-Fi, aber meine handleNetworkChange nie Brände (getestet einen UIAlertView verwenden). Stehend außerhalb des Wi-Fi ist im Bereich meiner App startet die Offline-Nachricht nur in Ordnung.

Mein Verdacht ist, dass es ein Problem mit dem Lebenszyklus des Viewcontroller ist, sollte dieser Code in der Funktion AppDelegate platziert werden? Möglicherweise ist das ein besseres Design zu beginnen.

War es hilfreich?

Lösung

Stellt sich heraus, es war eine Speicherverwaltung Problem, da ich nicht die Erreichbarkeit Variable wurde beibehalten, so sobald es die dealloc Spielraum gehen würde würde genannt werden und dass die stopNotifier Methode aufgerufen. Daher kein Updates, wie ich die Reichweite gehen würde.

Also statt:

reachability = [Reachability reachabilityForInternetConnection];

ich

reachability = [[Reachability reachabilityForInternetConnection] retain];

und alles funktioniert!

Eine coole Sache, die ich durch all dies gelernt haben, ist, dass Sie durch einfaches Drehen Flughafen Off eine unterbrochene Verbindung im Simulator simulieren kann. Nicht mehr erforderlich, außen herum zu wandern. :)

Andere Tipps

Werfen Sie einen Blick auf dem Erreichbarkeits Beispiel von Apple. Ich glaube, dass sie ihre Mitteilungen im AppDelegate starten. In einem meinem apps, habe ich eine Boolesche Variable, die ständig von der AppDelegate Connectivity Update-Methode aktualisiert wird so in meinen anderen Ansicht-Controller, ich brauche nur die Delegierten zu nennen und den Wert des IsConnected Bool überprüfen.

Nur durch einen anderen Gedanken hier ... Ich habe bemerkt, Probleme mit der Erreichbarkeit Klasse, in der sie Ihre Anwendung einfrieren können, wenn Sie Ihre Prüfung auf Erreichbarkeit. In meiner neuen Apps, springe ich die Erreichbarkeit Klasse zusammen und eher auf den Delegierten DidFail Relais Methoden für NSURLConnection und UIWebView, um zu bestimmen, ob ich echte Konnektivität. Ich muß nicht mehr für die Erreichbarkeit Klasse warten, um es herauszufinden, und nicht für mich dann zu entscheiden, was zu tun ist, habe ich einfach mit dem Web-Anruf gehen und die lokal als Fallback verwenden.

Hope, das hilft !!

Sie sollten systemconfiguration.framework in Ihrem Projekt enthalten.

Ihre Anwendung läuft nicht im Hintergrund.

Bitte fügen Sie diese Methode in Ihrer Stellvertretung Klasse

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

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

}

Danke

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top