2014-05-13 10 views
5

Używam AFNetworking i zastanawiałem się, jak wykryć scenariusz, gdy użytkownik jest podłączony do sieci Wi-Fi bez aktywnego połączenia z Internetem.AFNetworking wykrywa, kiedy połączenie Wi-Fi bez aktywnego połączenia z Internetem

Powielam ten scenariusz, kupując zasilanie routera bez łączenia linii dsl.

AFNetworking return AFNetworkReachabilityStatusReachableViaWiFi = 2 

mój kod:

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
     NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); 
     self.isInternetAvialable = status > 0; 
    }]; 

dzięki

I refacotred kod, aby być jak

AFNetworkReachabilityManager* manager = [AFNetworkReachabilityManager managerForDomain:@"http://www.google.com"]; 
     [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
      NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); 
      self.isInternetAvialable = status > 0; 
     }]; 
     [manager startMonitoring]; 

teraz blok nigdy się nazywa!

+0

nie akceptowaną odpowiedź pracował dla ciebie ?? – SandeepAggarwal

Odpowiedz

2

Zamiast używać [AFNetworkReachabilityManager sharedManager] które tylko monitoruje łączność z siecią, można użyć [AFNetworkReachabilityManager managerForDomain:(NSString *)domain] i przekazać odpowiednią nazwę hosta - na przykład "www.google.com" - w ten sposób można sprawdzić, czy etwork, z którym jesteś połączony, ma dostęp do Internetu - nadal można go oszukać przez lokalny DNS i serwer sieciowy, ale sądzę, że jest mało prawdopodobne, aby ktoś to zrobił.

Gdy masz AFNetworkReachabilityManager można ustawić blok zmian, jak to zrobić dla wspólnego menedżera

+0

Hej, proszę sprawdzić moją oryginalną edycję postu – ibm123

+0

Jak długo czekałeś? Upłynięcie czasu oczekiwania na DNS może trochę potrwać. Możesz także wypróbować dobrze znany host, taki jak 8.8.8.8, aby uniknąć wyszukiwania DNS – Paulw11

1

Użyj klasy Reachability i jej metody reachabilityForInternetConnection.

Reachability *networkReachability = [Reachability reachabilityForInternetConnection]; 
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];  

if (networkStatus == NotReachable) 
{   
    NSLog(@"There is NO Internet connection");   
} 
else 
{   
    NSLog(@"There is Internet connection");   
} 
0

Przejdź przez klasę Reachability firmy Apple. Ma wszystkie potrzebne funkcje. Najlepiej tutaj użyć domeny (np. Google), aby sprawdzić rzeczywistą łączność z Internetem.

Podsumowując przykładowy kod:

dodawania obserwator w didFinishLaunchingWithOptions:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(checkNetworkStatus:) 
              name:kReachabilityChangedNotification 
              object:nil]; 

internetReachable = [[Reachability reachabilityForInternetConnection] retain]; 

[internetReachable startNotifier]; 

// check if a pathway to a random host exists 

hostReachable = [Reachability reachabilityWithHostname:@"SOME_HOST"]; 

[hostReachable startNotifier]; 

Następnie w metodzie docelowej:

- (void) checkNetworkStatus:(NSNotification *)notice { 

NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 

switch (internetStatus) 
{ 
    case NotReachable: 
    { 
     NSLog(@"The internet is down."); 

     break; 
    } 
    case ReachableViaWiFi: 
    { 
     NSLog(@"The internet is working via WIFI."); 

     break; 
    } 
    case ReachableViaWWAN: 
    { 
     NSLog(@"The internet is working via WWAN."); 

     break; 
    } 
} 

NetworkStatus hostStatus = [hostReachable currentReachabilityStatus]; 

switch (hostStatus) 
{ 
    case NotReachable: 
    { 
     NSLog(@"A gateway to the host server is down."); 

     break; 
    } 
    case ReachableViaWiFi: 
    { 
     NSLog(@"A gateway to the host server is working via WIFI."); 

     break; 
    } 
    case ReachableViaWWAN: 
    { 
     NSLog(@"A gateway to the host server is working via WWAN."); 

     break; 
    } 
} 
} 
+0

Niestety, dostępność firmy Apple w rzeczywistości nie mówi, czy można połączyć się z hostem, tylko jeśli może on łączyć się z hostem. Zgodnie z ich uwagą: 'Uwaga: Zasięg osiągalny nie może powiedzieć twojej aplikacji, jeśli możesz połączyć się z określonym hostem, tylko że dostępny jest interfejs, który może zezwolić na połączenie i czy jest to interfejs WWAN. Możesz to przetestować poprzez odłączenie internet z routera WiFi. Osiągalność będzie nadal oznaczać, że Google jest osiągalny, o ile urządzenie jest podłączone do sieci Wi-Fi. – jeffjv

Powiązane problemy