2012-11-16 4 views
10

Ich benutze Apples Erreichbarkeitscode und richte beide ersten Benachrichtigungen ein, wenn sich die Netzwerkerreichbarkeit ändert und bevor eine Serververbindung hergestellt wird. Der Code funktioniert, wenn ich auf WLAN bin und den Wi-Fi Access Point ausschalte. Allerdings, wenn ich die App mit WLAN und der zugrunde liegenden Breitbandverbindung zu arbeiten, und dann, sobald die App läuft, und dann trennen Sie den Wi-Fi-Router vom Breitband-Router (dh Wi-Fi ist eingeschaltet, aber es gibt kein Internet Konnektivität), und ich mache eine Erreichbarkeitsprüfung, der Netzwerkstatus, den ich bekomme, ist ReachableViaWiFi. Ich habe versucht, sowohl ErreichbarkeitFürInternetConnection und ErreichbarkeitWithHostName.Erreichbarkeit funktioniert nicht, wenn Wi-Fi verbunden ist, aber kein Internet

Haben Sie Ideen, ob der Erreichbarkeitscode von Apple verwendet werden kann, um eine Situation zu erkennen, in der das WLAN verbunden ist, aber keine zugrunde liegende Netzwerkverbindung besteht?

Danke!

Antwort

5

ok, ich habe die Antwort darauf gefunden - Apples Erreichbarkeit testet die tatsächliche Verbindung zum Host nicht. Siehe die Antwort von @Zhami in dem SO unten stehenden Link:

How to write a simple Ping method in Cocoa/Objective-C

Im Wesentlichen, wenn Sie zuerst die App starten und eine Erreichbarkeitsprüfung tun, scheint iOS ein DNS-Lookup zu tun, und wenn es kein Internet, Die Überprüfung schlägt fehl. Wenn Sie zum ersten Mal die Erreichbarkeit überprüfen, wird ein aussagekräftiger Wert zurückgegeben. Wenn Sie jedoch beim Start der App verbunden sind und nach einiger Zeit die Internetverbindung verlieren (obwohl Sie immer noch mit WiFi/3G/4G verbunden sind, aber keine Internetverbindung haben), sind weitere Erreichbarkeitsprüfungen erreichbar, obwohl das Internet oder der von Ihnen angegebene Host nicht erreichbar ist nicht mehr.

Also, wenn Sie wirklich für die Konnektivität in Echtzeit überprüfen möchten, sollten Sie die Verwendung von folgenden:

-(BOOL) isConnected 
{ 

    NSString* url = [NSURL URLWithString:@"http://www.google.com/m"]; 
    ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; 
    [request setTimeOutSeconds:10]; 
//customize as per your needs - note this check is synchronous so you dont want to block the main thread for too long 
    [request setNumberOfTimesToRetryOnTimeout:0]; 
    [request startSynchronous]; 

    NSError *error = [request error]; 
    if (error) 
    { 
     DLog(@"connectivity error"); 
     return NO; 
    } 
    else 
    { 
     DLog(@"connectivity OK"); 
     return YES; 
    } 

} 
+0

das funktioniert nicht ... – user3079872

+0

es wird funktionieren, wenn ich überprüfe, ob Internet verfügbar ist oder nicht. Wie höre ich zu und zeige automatisch, dass ein Internet nicht verfügbar ist, sofort, während das Internet getrennt ist? – NandhaKumar

1

Dies ist eine sehr alte Post, aber könnte hier als Referenz bleiben. In den Erreichbarkeits Beispiel Klassen können Sie den Code unten finden:

- (BOOL)startNotifier 
{ 
    BOOL returnValue = NO; 
    SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; 

    if (SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context)) 
    { 
     if (SCNetworkReachabilityScheduleWithRunLoop(_reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)) 
     { 
      returnValue = YES; 
     } 
    } 

    return returnValue; 
} 

Dies wird Ihre _reachabilityRef zu Änderungen im Netzwerk aktualisiert halten.

Verwandte Themen