2009-04-12 4 views
1

Ich verwende NSURLConnection in einer iPhone App als so:Ermitteln der Internetverfügbarkeit auf dem iPhone?

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest: request delegate: self]; 

Der Antrag ist aufgebaut und funktioniert, aber ich möchte eine „Verbindung nicht verfügbar“ Nachricht an den Benutzer zur Verfügung stellen zu können, wenn es isn Es ist keine Verbindung verfügbar. Gibt es einen schnellen Weg, um festzustellen, ob eine Internetverbindung auf dem iPhone verfügbar ist?

Würde etwas so einfach wie das Hinzufügen der folgenden nach dem NSURLConnection Initing:

if (conn) { // do normal processing } else { // display connection not available message } 

Vielen Dank im Voraus, Ben

Antwort

1

Raj, dieser Code funktioniert, aber nicht immer das gewünschte Ergebnis.

Die Art, wie der TCP-Stack auf dem iPhone funktioniert, unterscheidet sich sehr von dem, was erwartet werden sollte. Mit dem Code "Erreichbarkeit" ist manchmal eine Netzwerkverbindung vorhanden, die jedoch nicht zuverlässig erkannt wird. Wenn Sie MobileSafari starten und dann versuchen, die Verbindung mit dem "Erreichbarkeits" -Code (Raj-Code) zu überprüfen, wird das korrekte Ergebnis angezeigt.

Die Art und Weise, wie ich die Netzwerkverbindung am effektivsten gefunden habe, besteht darin, eine NSURLConnection-Prüfung auszuführen, wenn die Anwendung in einem separaten Thread geladen wird. Rufen Sie eine URL an, von der Sie wissen, dass sie etwas wie "Ja" (d. H. HTML-Datei auf Ihrem Server oder etwas) zurückgibt. Überprüfen Sie dann, ob das zurückgegebene Ergebnis dem statischen Text entspricht. Auf diese Weise wissen Sie, dass der NSURLConnection-Stack im Gegensatz zu dem "Erreichbarkeits" -Code, der nicht ganz konsistent funktioniert, richtig funktioniert.

+0

@jasonb - das einzige Problem mit diesem Ansatz ist die Zeit, die es braucht, um diese Überprüfung durchzuführen - Sie möchten nicht, dass Ihre Benutzer Sekunden warten, nur um das Internet zu erkennen. Früher habe ich den gleichen Stil gemacht, aber meinen Code geändert, als ich hörte, dass Apple Apps ablehnt, wenn sie ewig dauern, um das Internet zu erkennen – Raj

+0

@Raj - Sie können den Prozess an einen anderen NSThread senden, wenn Sie keinen Internetzugang benötigen Anwendung startet. – Jason

5

das für mich arbeitet und von Apfel seismischen xml Projekt genommen:

- (BOOL)isDataSourceAvailable 
{ 
    static BOOL checkNetwork = YES; 
    if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once. 
     checkNetwork = NO; 

     Boolean success;  
     const char *host_name = "twitter.com"; // your data source host name 

     SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name); 
     SCNetworkReachabilityFlags flags; 
     success = SCNetworkReachabilityGetFlags(reachability, &flags); 
     _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); 
     CFRelease(reachability); 
    } 
    return _isDataSourceAvailable; 
}