2009-08-15 11 views
8

Szukałem, ale nie widzę podobnego pytania.Osiągalność czasami kończy się niepowodzeniem, nawet jeśli mamy połączenie z Internetem

Dodałem metodę sprawdzania połączenia internetowego według przykładu Dostępności. Działa przez większość czasu, ale gdy jest zainstalowany na iPhonie, często kończy się niepowodzeniem, nawet jeśli mam połączenie z Internetem (tylko wtedy, gdy na 3G/EDGE - WiFi jest OK).

Zasadniczo poniższy kod zwraca NO.

Po przełączeniu się do innej aplikacji, powiedzmy Poczta lub Safari, i połącz, a następnie przełącz się z powrotem do aplikacji, kod wskazuje, że internet jest osiągalny. Wygląda na to, że Kinda potrzebuje "szturchnięcia".

Ktoś to widział? Jakieś pomysły?

Dziękujemy 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; 

}

Odpowiedz

7

Wygląda jakbyś odpędza się niektóre podstawowe kodu osiągalności z przykładowym kodem Apple. Co stanie się, gdy pozostawisz je w stanie nienaruszonym i zrobisz to?

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

Przepraszam, jestem trochę noob. Dodałem przykładowe klasy dostępności do mojego projektu, ale nie mogę się skompilować. \t Osiągalność * hostReach = [[osiągalność osiągalnościWithHostName: @ "www.apple.com"] zatrzymaj]; Nie działa. Nie można znaleźć metody osiągalnościWithHostName. będę szczypanie ... – stoutyhk

+0

to działa: + (Bool) doWeHaveInternetConnection2 { \t \t if ([[osiągalności sharedReachability] internetConnectionStatus] == NotReachable) { \t \t powrót NO; \t} \t inny \t { \t \t powrotu TAK; \t} \t } – stoutyhk

+1

Ten kod zawsze daje "NotConnected" mimo, że jest podłączony. ale po przejściu do "osiągniętej metody" daje ci właściwy status.więc jak uzyskać poprawny status na pierwszym miejscu? – Nnp

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

} 

(przepraszam, format kodu nie działa w komentarzu)

+0

Wywołanie funkcji '+ sharedReachability' mówi, że używasz wersji Dostępnej w wersji 2.0. Najnowsza wersja została opublikowana tydzień temu i działa znacznie lepiej niż ta, która używa singletona. Odpowiedź Matta poniżej jest oparta na najnowszej wersji, dlatego masz problemy z jej skompilowaniem. Pobierz najnowszą wersję i sprawdź, czy lepiej odpowiada Twoim potrzebom. – Tim

+0

Dzięki - nie wiedziałem, że istnieje nowa wersja. Wielkie dzięki. – stoutyhk

1

W wersji 2, kod powinien być:

+ (BOOL) doWeHaveInternetConnection2{ 

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

}

+0

// availabilityabilityForInternetConnection- sprawdza, czy domyślna trasa jest dostępna. // Powinien być używany przez aplikacje, które nie łączą się z określonym hostem. – stoutyhk

+0

Testowanie tej ostatniej nocy, na urządzeniu iPhone, w trybie samolotowym, kod ten zwrócił wartość TAK, ale podczas pobierania adresu URL nie powiodło się. Więc nie skorzystam z tego. Wracając do sprawdzenia połączenia z konkretnym hostem. – stoutyhk

+0

Testowanie połączenia z konkretnym hostem za pomocą funkcji osiągalnościWithHostName zwróci fałszywy alarm, najwyraźniej za każdym razem, gdy telefonowi zostanie przypisany adres IP. Wypróbuj: odłącz kabel od routera bezprzewodowego, gdy telefon jest do niego podłączony, i sprawdź wynik [Dostępność zasięguWithHostName:] To będzie TAK za każdym razem, nawet jeśli oczywiście nie można dotrzeć do hosta. – Oscar

1

Co znalazłem jest to, że musisz zdawać sobie sprawę z tego, jaki wątek (runloop), z którego najpierw wywołujesz startNotifier. Jeśli wywołasz go z wątku tła lub NSOperation, uruchomisz pętlę powiadamiającą w pętli uruchamiania wątku.

Jeśli udostępniasz instancje, być może chwytając singleton, tak jak w [Reachability reachabilityForInternetConnection], z bieżącego kodu (2.0) wynika, że ​​ostatni wywoływacz wygrywa i otrzymuje zestaw powiadomień do swojej pętli uruchamiania.

Powiązane problemy