2010-12-21 10 views
5

Meine iPhone App ist ziemlich einfach mit einer Ansicht, die alles behandelt, in ViewDidLoad Ich überprüfe, ob wir eine Internetverbindung haben und wenn wir tun wir laden aus dem Internet und wenn nicht laden wir von einem lokale Ressource. Und das funktioniert gut.Erreichbarkeit Netzwerk Änderung Ereignis nicht feuern

Um mein handleNetworkChange Ereignis zu testen, habe ich alle Mobilfunkdaten ausgeschaltet, aber das Wifi eingeschaltet. Innerhalb der Reichweite des WLAN habe ich die App gestartet und alles funktioniert perfekt. Dann gehe ich außerhalb des WLAN-Bereichs, aber mein handleNetworkChange wird nie ausgelöst (getestet mit einem uAlertView). Außerhalb der Wi-Fi-Bereich meine App startet die Offline-Nachricht ganz gut.

Mein Verdacht ist, dass es ein Problem mit dem ViewController-Lebenszyklus ist, sollte dieser Code in der AppDelegate-Funktion platziert werden? Möglicherweise ist das ein besseres Design für den Anfang.

+0

Ich denke, die NSNotification-Zeile sollte NACH der init Erreichbarkeit Instanz deklariert werden. – Raptor

Antwort

18

Es stellte sich heraus, dass es sich um ein Speicherverwaltungsproblem handelte, da ich die Erreichbarkeitsvariable nicht beibehalten wollte. Sobald sie den Gültigkeitsbereich verlassen würde, würde dealloc aufgerufen und die stopNotifier-Methode aufgerufen. Daher keine Updates, da ich außerhalb der 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 habe, ist, dass Sie eine verlorene Verbindung im Simulator simulieren können, indem Sie einfach Airport Off ausschalten. Nicht mehr draußen herumlaufen müssen. :)

+0

Muss ich das irgendwann freigeben? Möglicherweise in Dealloc meines Viewcontrollers? – ashansky

+0

Ich verwende ARC. es einschränkt mich mit behalten.was jetzt??? –

+1

In diesem Fall müssen Sie eine starke Referenz des 'Erreichbarkeitsobjekts 'irgendwo aufbewahren (z. B. als' @ Eigenschaft 'Ihrer ViewController-Klasse), um es beizubehalten. – fatuhoku

0

Werfen Sie einen Blick auf das Erreichbarkeitsbeispiel von Apple. Ich glaube, sie starten ihre Benachrichtigungen im AppDelegate. In einer meiner Apps habe ich eine boolesche Variable erstellt, die ständig durch die AppDelegate-Konnektivitätsaktualisierungsmethode aktualisiert wird. Daher muss ich in meinen anderen View-Controllern nur den Delegaten aufrufen und den Wert von IsConnected bool überprüfen.

Nur durch einen anderen Gedanken hier ... Ich habe Probleme mit der Erreichbarkeitsklasse festgestellt, in denen es Ihre App einfrieren kann, wenn Sie nach der Erreichbarkeit suchen. In meinen neuen Apps überspringe ich die Erreichbarkeitsklasse insgesamt und verwende stattdessen die DidFail-Delegate-Methoden für NSUrlConnection und UIWebView, um festzustellen, ob ich echte Konnektivität habe. Ich muss nicht mehr auf die Erreichbarkeitsklasse warten, um es herauszufinden, und es fällt mir dann nicht zu, zu entscheiden, was ich tun soll. Ich fahre einfach mit dem Web-Call fort und benutze das Lokale als Fallback.

Hoffe das hilft !!

+0

hmm Ich muss etwas ernsthaft falsch machen. Ich habe versucht, es auf die AppDelegate zu verschieben und immer noch nichts .... – ashansky

-2

Ihre Anwendung läuft nicht im Hintergrund.

Bitte fügen Sie diese Methode in Ihre 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; 
     }); 
    }]; 

} 

Dank

-1

Sie sollten systemconfiguration.framework in Ihrem Projekt enthalten.