Überprüfen für Internetverbindungen in Objective C

stimmen
15

Ich habe durch das Stanford iPhone arbeite natürlich Codierung und zur Zeit in die Twitter-API Einhaken. Was ich möchte, ist genau zu tun, zwei Fehlerbedingungen behandeln: Eine für, wenn der Benutzername ungültig ist, und eine andere für, wenn das Gerät gerade nicht mit dem Internet verbunden. Leider, wie es steht, kann das Beste, was ich vermuten ist, ob die Rückkehr von der API Null ist oder nicht - was der Fall für beide Bedingungen.

Was ich suche ist eine Linie oder zwei von Code, der für eine Verbindung prüfen kann, bevor eine Abruf von Remote-Daten versucht. Ich konnte durch die Apple-Dokumentation sichten, aber ich dachte: Warum Sie nicht zu meinen Gunsten stellte die Frage Jungs und vielleicht von anderen?

Zusätzliche Informationen: Mit Objective-C und das iPhone SDK in XCode.

Veröffentlicht am 25/01/2009 um 16:53
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
30

Werfen Sie einen Blick auf Apples Beispielcode. Das Erreichbarkeits Projekt zeigt, wie eine Verbindung zu erkennen.

http://developer.apple.com/iphone/library/samplecode/Reachability/index.html

Beantwortet am 25/01/2009 um 17:35
quelle vom benutzer

stimmen
9

Dieser Code funktioniert, funktioniert aber nicht immer das gewünschte Ergebnis erstellen.

Die Art und Weise, dass der TCP-Stack auf dem iPhone funktioniert, ist sehr verschieden von dem, was zu erwarten. Mit dem „Erreichbarkeits“ Code, manchmal wird eine Netzwerkverbindung vorhanden sein, wird aber nicht sicher erkannt werden. Allerdings startet Mobile dann Konnektivität er erneut versucht, zu überprüfen, mit „Erreichbarkeits“ Code wird in das richtige Ergebnis führen.

Die Art und Weise, die ich am effektivsten bei der Bestimmung der Netzwerkverbindung gefunden habe, ist eine NSURLConnection Prüfung, wenn die Anwendung geladen wird, in einem separaten Thread ausgeführt werden. Machen Sie einen Anruf an eine URL, die Sie wissen, wird wieder so etwas wie „Ja“ (dh HTML-Datei auf dem Server oder etwas). Dann schauen Sie sich das zurückgegebene Ergebnis auf den statischen Text, um sicherzustellen, gleich ist. Auf diese Weise wissen Sie, dass der NSURLConnection Stapel richtig heraus erreichen, in Bezug auf den „Erreichbarkeits“ Code im Gegensatz, die konsequent nicht ganz funktionieren.

Beantwortet am 10/05/2009 um 05:45
quelle vom benutzer

stimmen
9

Sie müssen in dem Fehlercodes lesen und darauf zu reagieren, so gut Sie können. Ich habe einige Erfahrung mit diesem hatte im Wesentlichen kann es davon abhängen, welche Dienstleistung Sie mit interagieren, aber mit delicious.com ich Fehler -1012 für schlechte Benutzer / passwd, die, wenn Sie es nachschlagen ist

NSURLErrorUserCancelledAuthentication =     -1012,

obwohl klar ist, dass Formulierung irreführend, obwohl ich konsequent in schlechten Benutzer / passwd und Putting bekommen, dass Fehlercode replizieren kann. Technisch gesehen ist das iPhone nie nicht mit dem Internet verbunden, wenn Sie in einer seltsamen Region, die Probleme mit der Datenverbindung hat. Ich sehe es auch ein Fehlercode

NSURLErrorNotConnectedToInternet =      -1009,

Ich würde durch NSURLError.h (und es gibt mehr ähnlich)

NSURLErrorUnsupportedURL =          -1002,
NSURLErrorCannotFindHost =          -1003,
NSURLErrorCannotConnectToHost =         -1004,
NSURLErrorNetworkConnectionLost =       -1005,

etc...

alles, was Sie tun müssen, ist eine Referenz auf das Objekt NSError erhalten geben Sie in Check es ist Codefehler wie so

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

die Konstante ist etwas, was ich in meinem eigenen Quellcode definiert haben, die im Wesentlichen ist -1012

Beantwortet am 25/01/2009 um 17:31
quelle vom benutzer

stimmen
8

Dies funktioniert für mich und wird von Apple 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;
}
Beantwortet am 26/03/2009 um 16:18
quelle vom benutzer

stimmen
3

Erreichbarkeit ist separate Klasse durch Sie den Code zugreifen können

   Reachability *curReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus)
{
    case NotReachable:
    {
        UIAlertView *connectionAlert = [[UIAlertView alloc] init];
        [connectionAlert setTitle:@"Error"];
        [connectionAlert setMessage:@"Please check your network connection."];
        [connectionAlert setDelegate:self];
        [connectionAlert setTag:1];
        [connectionAlert addButtonWithTitle:@"Back"];
        [connectionAlert show];

        break;
    }
    case ReachableViaWWAN:
    {


    }
    case ReachableViaWiFi:
    {
    }
}
Beantwortet am 20/08/2013 um 06:40
quelle vom benutzer

stimmen
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
Beantwortet am 14/08/2012 um 07:40
quelle vom benutzer

stimmen
2

Bei der Verwendung von Apples Erreichbarkeits bedenken Sie, dass Sie sich selbst verbunden ist, über WWAN (ReachableViaWWAN) oder WiFi (ReachableViaWiFi) finden können, ohne auch nur mit dem Internet verbunden ist, wenn Sie versuchen, eine Host zu erreichen wie google.com oder apple.com (vielleicht ein Caching Problem). Ich beenden meinen eigenen Server auf Aufruf und eine Ziffer immer wieder - die beste Lösung in meinem Fall zumindest.

Beantwortet am 18/05/2011 um 11:40
quelle vom benutzer

stimmen
2

Was ist Ihre aktuelle Verbindung Code aussehen? Wenn Sie verwenden NSURLConnection +sendSynchronousRequest:returningResponse:error:, dann brauchen Sie nur die Adresse eines NSError Variable übergeben und prüfen, ob danach; mit connectionWithRequest:delegate:, sollten Sie implementieren -connection:didFailWithError:in den Delegierten.

Beantwortet am 25/01/2009 um 16:59
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more