2009-08-15 13 views
8

Ich habe gesucht, kann aber keine ähnliche Frage sehen.Manchmal schlägt die Erreichbarkeit manchmal fehl, auch wenn wir eine Internetverbindung haben

Ich habe eine Methode hinzugefügt, um nach dem Beispiel der Erreichbarkeit nach einer Internetverbindung zu suchen. Es funktioniert die meiste Zeit, aber wenn es auf dem iPhone installiert wird, scheitert es oft sogar, wenn ich Internetkonnektivität habe (nur wenn 3G/EDGE - WiFi in Ordnung ist).

Grundsätzlich gibt der folgende Code NO zurück.

Wenn ich zu einer anderen App wechseln, sagen Mail oder Safari, und verbinden, dann zurück zur App wechseln, dann sagt der Code, dass das Internet erreichbar ist. Irgendwie scheint es, als ob es einen "Nudge" braucht.

Wer hat das schon einmal gesehen? Irgendwelche Ideen?

Vielen Dank James

+ (BOOL) doWeHaveInternetConnection{ 

BOOL success; 
// google should always be up right?! 
const char *host_name = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; 

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, 
                      host_name); 
SCNetworkReachabilityFlags flags; 
success = SCNetworkReachabilityGetFlags(reachability, &flags); 
BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); 

if (isAvailable) { 
    NSLog(@"Google is reachable: %d", flags); 
}else{ 
    NSLog(@"Google is unreachable"); 
} 

return isAvailable; 

}

Antwort

7

Sieht aus wie Sie einige grundlegende Erreichbarkeits Code aus dem Apple-Beispielcode ausgezogen habe aus. Was passiert, wenn Sie es intakt lassen und dies tun?

Reachability *hostReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain]; 

NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 

if (netStatus == NotReachable) 
{ 
    NSLog(@"NotReachable"); 
} 

if (netStatus == ReachableViaWiFi) 
{ 
    NSLog(@"ReachableViaWiFi"); 
} 

if (netStatus == ReachableViaWWAN) 
{ 
    NSLog(@"ReachableViaWWAN"); 
} 
+0

Entschuldigung, ich bin ein bisschen wie ein Noob. Ich habe die Beispiel-Erreichbarkeitsklassen zu meinem Projekt hinzugefügt, kann aber nicht kompilieren. \t Erreichbarkeit * hostReach = [[Erreichbarkeit ErreichbarkeitWithHostName: @ "www.apple.com"] beibehalten]; Funktioniert nicht. Die Methode reachabilityWithHostName kann nicht gefunden werden. ich Zwicken halten werde ... – stoutyhk

+0

dies funktioniert: + (BOOL) doWeHaveInternetConnection2 { \t \t if ([[Erreichbarkeits sharedReachability] internetConnectionStatus] == NotReachable) { \t \t Rückkehr NO; \t} \t sonst \t { \t \t Rückkehr JA; \t} \t } – stoutyhk

+1

dieser Code gibt Ihnen immer "NotConnected" obwohl es verbunden ist. aber sobald es zu "reachabilityChanged" Methode geht, gibt es Ihnen korrekten Status.Also, wie bekomme ich den richtigen Status an erster Stelle? – Nnp

1
+ (BOOL) doWeHaveInternetConnection2{ 
     if([[Reachability sharedReachability] internetConnectionStatus] == NotReachable) { 
        return NO; 
      } 
      else 
      { 
        return YES; 
      } 

} 

(sorry, Code-Format nicht in Kommentar funktionierte)

+0

Der Aufruf von '+ sharedReachability' sagt mir, dass Sie eine Pre-2.0-Version von Erreichbarkeit verwenden. Die letzte Version wurde vor ungefähr einer Woche veröffentlicht und funktioniert viel besser als die, die einen Singleton verwendet hat. Matts Antwort unten basiert auf der neuesten Version, weshalb Sie Probleme hatten, sie zu kompilieren. Besorgen Sie sich die neueste Version und sehen Sie, ob es Ihren Bedürfnissen besser entspricht. – Tim

+0

Danke - wusste nicht, dass es eine neue Version gab. Danke vielmals. – stoutyhk

1

Mit der Version 2 sollte Code sein:

+ (BOOL) doWeHaveInternetConnection2{ 

if([Reachability reachabilityForInternetConnection] == NotReachable) { 
    return NO; 
} 
else 
{ 
    return YES; 
} 

}

+0

// reachabilityForInternetConnection - Prüft, ob die Standardroute verfügbar ist. // Sollte von Anwendungen verwendet werden, die keine Verbindung zu einem bestimmten Host herstellen – stoutyhk

+0

Beim Testen dieser letzten Nacht auf dem iPhone-Gerät im Flugzeugmodus gab dieser Code ein JA zurück, aber beim Abrufen einer URL ist ein Fehler aufgetreten. Also würde ich das nicht benutzen. Zurück zum Überprüfen der Verbindung zu einem bestimmten Host. – stoutyhk

+0

Das Testen einer Verbindung zu einem bestimmten Host mithilfe von ErreichbarkeitWithHostName gibt eine falsche positive Antwort zurück, anscheinend immer dann, wenn Ihrem Telefon eine IP-Adresse zugewiesen wurde. Probieren Sie es aus: Trennen Sie das Kabel von Ihrem WLAN-Router, während Ihr Telefon mit ihm verbunden ist, und überprüfen Sie das Ergebnis von [Erreichbarkeit ErreichbarkeitWithHostName:] Es wird jedes Mal JA, auch wenn Sie offensichtlich nicht den Host erreichen können. – Oscar

1

Was ich gefunden habe, ist, dass Sie wissen müssen, von welchem ​​Thread (Runloop) Sie zuerst anrufen startNotifier. Wenn Sie es von einem Hintergrundthread oder NSOperation aufrufen, starten Sie die Notifier-Schleife in der Ausführungsschleife dieses Threads.

Wenn Sie Instanzen teilen, vielleicht ein Singleton wie in [Reachability reachabilityForInternetConnection] greifen, erscheint es aus dem aktuellen Code (2.0), dass der letzte Aufrufer gewinnt und den Notifier auf seine Laufschleife setzt.

Verwandte Themen