Sprawdzanie Internet Łącze w Objective C

głosy
15

Pracuję przez Stanford iPhone Coding kurs i obecnie spinanie do API Twittera. Co chciałbym zrobić, to dokładnie uchwyt dwóch warunków błędów: jedna dla kiedy nazwa użytkownika jest nieprawidłowa, a inny dla kiedy urządzenie nie jest aktualnie podłączony do Internetu. Niestety, w chwili obecnej, najlepiej mogę domyślać się, czy powrót z API jest zerowa lub nie - co ma miejsce w przypadku obu warunkach.

Co szukam to linia lub dwie z kodem, który można sprawdzić na połączenie przed przystąpieniem do jakichkolwiek pobierania danych zdalnych. Mógłbym przesiać przez dokumentacji firmy Apple ale pomyślałem: dlaczego nie umieścić pytanie do Was na moją korzyść i być może z innymi?

Dodatkowe informacje: Korzystanie z Objective-C i iPhone SDK w Xcode.

Utwórz 25/01/2009 o 16:53
źródło użytkownik
W innych językach...                            


8 odpowiedzi

głosy
30

Spójrz na przykładowy kod Apple. Projekt osiągalności pokazuje jak wykrywać połączenia.

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

Odpowiedział 25/01/2009 o 17:35
źródło użytkownik

głosy
9

Ten kod działa, ale nie zawsze stworzyć pożądany rezultat.

Sposób, że stos TCP na iPhone działa bardzo różni się od tego, co należy się spodziewać. Z „osiągalności” kodu, czasami połączenie sieciowe będzie obecny, ale nie będą niezawodnie wykrywane. Jednak uruchomienie MobileSafari następnie powtórne przeprowadzanie aby sprawdzić łączność z „osiągalności” kodu spowoduje poprawnego wyniku.

Sposób, w jaki znalazłem najbardziej skuteczne w określaniu łączność sieciową jest uruchomić sprawdzanie NSURLConnection podczas ładowania aplikacji w oddzielnym wątku. Wykonywanie połączenia do adresu URL, który na pewno zwróci coś jak „yes” (czyli plik HTML na serwerze lub coś). Następnie upewnij się, czy zwrócony wynik jest równy tekstu statycznego. W ten sposób, wiesz, że stos NSURLConnection jest dotarcie prawidłowo, w przeciwieństwie do „osiągalności” kodu, który nie dość działać konsekwentnie.

Odpowiedział 10/05/2009 o 05:45
źródło użytkownik

głosy
9

Musisz czytać kody błędów i odpowiedzieć najlepiej jak to tylko możliwe. Miałem pewne doświadczenie z tym w zasadzie może to zależeć od tego, co usługa są interakcje z ale z Delicious.com otrzymuję błąd -1012 za złe użytkownika / passwd, który jeśli jest to sprawdzić

NSURLErrorUserCancelledAuthentication =     -1012,

choć wyraźnie, że sformułowanie jest mylące, choć mogę konsekwentnie replikować umieszczenie w złym user / passwd i coraz to kod błędu. Technicznie iPhone nigdy nie jest podłączony do Internetu, chyba że jesteś w jakimś obcym regionie, który ma problemy z dostępem do danych. Widzę też tam jest kod błędu

NSURLErrorNotConnectedToInternet =      -1009,

Chciałbym przejść NSURLError.h (a jest ich więcej tak)

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

itp...

wszystko co musisz zrobić, to odwołanie do obiektu NSError zdałeś się i sprawdź to kod błędu jak tak

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

stała jest coś co określono w moim kodu źródłowego, który jest zasadniczo -1012

Odpowiedział 25/01/2009 o 17:31
źródło użytkownik

głosy
8

to działa na mnie i jest pobierana z jabłkiem projektu xml sejsmicznych:

- (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;
}
Odpowiedział 26/03/2009 o 16:18
źródło użytkownik

głosy
3

osiągalność jest oddzielna klasa pośrednictwem można uzyskać dostęp do kodu

   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:
    {
    }
}
Odpowiedział 20/08/2013 o 06:40
źródło użytkownik

głosy
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
Odpowiedział 14/08/2012 o 07:40
źródło użytkownik

głosy
2

Podczas korzystania osiągalności misia Apple na uwadze, że można znaleźć się jest połączona za pośrednictwem sieci WWAN (ReachableViaWWAN) lub WiFi (ReachableViaWiFi) bez konieczności łączenia się z Internetem, nawet jeśli starają się dotrzeć do jakiegoś hosta jak google.com lub apple.com (może buforowanie kwestia). Skończyło się na wywołanie własny serwer i wracając cyfrę - najlepsze rozwiązanie w moim przypadku przynajmniej.

Odpowiedział 18/05/2011 o 11:40
źródło użytkownik

głosy
2

Jaki jest Twój aktualny kod gra wygląda? Jeśli używasz NSURLConnection +sendSynchronousRequest:returningResponse:error:, to po prostu trzeba przekazać adres zmiennej NSError i sprawdzić, czy później; z connectionWithRequest:delegate:, należy wdrożyć -connection:didFailWithError:w delegata.

Odpowiedział 25/01/2009 o 16:59
źródło użytkownik

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