Kontroll For Internett-tilkobling i Objective C

stemmer
15

Jeg har jobbet gjennom Stanford iPhone Coding kurs og tiden hooking i Twitter API. Det jeg ønsker å gjøre er nøyaktig håndtere to feiltilstander: Én for når brukernavnet er ugyldig, og en annen for når enheten ikke er koblet til Internett. Dessverre, som det står, det beste jeg kan anta er hvorvidt avkastningen fra API er null eller ikke - som er tilfelle for begge forholdene.

Hva jeg ser etter er en linje eller to av kode som kan se etter en tilkobling før du prøver noen hente eksterne data. Jeg kunne sile gjennom Apple dokumentasjon, men jeg skjønte: Hvorfor ikke sette spørsmålet til dere for min fordel og kanskje andres?

Ytterligere info: Ved hjelp av Objective-C og iPhone SDK i XCode.

Publisert på 25/01/2009 klokken 15:53
kilden bruker
På andre språk...                            


8 svar

stemmer
30

Ta en titt på Apples eksempelkode. Reachability prosjektet viser hvordan du kan oppdage en tilkobling.

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

Svarte 25/01/2009 kl. 16:35
kilden bruker

stemmer
9

At koden fungerer, men ikke alltid skape den ønskede resultat.

Måten at TCP-stakken på iPhone fungerer er svært forskjellig fra hva som bør forventes. Med "Reachability" kode, noen ganger en nettverkstilkobling vil være til stede, men vil ikke påvises med sikkerhet. Men lansere Mobile nytt og prøve å sjekke tilkobling med "Reachability" koden vil resultere i riktig resultat.

Måten som jeg har funnet mest effektive i å bestemme nettverkstilkobling er å kjøre en NSURLConnection sjekk når applikasjonen blir lastet inn, i en egen tråd. Foreta et anrop til en nettadresse som du vet vil returnere noe sånt som "Ja" (dvs. HTML-fil på din server eller noe). Så sjekk for å være sikker på at det returnerte resultatet er lik den statiske teksten. På den måten vet du at NSURLConnection stabelen nå ut på riktig måte, i motsetning til "Reachability" kode som ikke helt fungerer konsekvent.

Svarte 10/05/2009 kl. 04:45
kilden bruker

stemmer
9

Du må lese i feilkoder og svare så godt du kan. Jeg har hatt noen erfaring med dette egentlig kan det avhenge av hvilken tjeneste du er i samspill med, men med delicious.com jeg får error -1012 for dårlig bruker / passwd som hvis du ser det er

NSURLErrorUserCancelledAuthentication =     -1012,

men klart at ordlyden er misvisende, selv om jeg kan konsekvent gjenskape sette i dårlig user / passwd og få det feilkode. Teknisk iPhone er aldri ikke koblet til Internett med mindre du er i en merkelig region som har problemer med datatilkobling. Jeg ser også at det er en feilkode

NSURLErrorNotConnectedToInternet =      -1009,

Jeg vil gå gjennom NSURLError.h (og det er mer sånn)

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

etc...

alt du trenger å gjøre er å få en referanse til NSError objektet du gått inn og sjekke det er feilkode som så

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

konstant er noe jeg har definert i min egen kildekode som er essensielt -1012

Svarte 25/01/2009 kl. 16:31
kilden bruker

stemmer
8

dette fungerer for meg, og er hentet fra apple seismikk xml-prosjektet:

- (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;
}
Svarte 26/03/2009 kl. 15:18
kilden bruker

stemmer
3

reachability er egen klasse gjennom at du kan få tilgang til koden

   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:
    {
    }
}
Svarte 20/08/2013 kl. 05:40
kilden bruker

stemmer
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
Svarte 14/08/2012 kl. 06:40
kilden bruker

stemmer
2

Når du bruker Apples Reachability husk at du kan finne deg selv å bli koblet via WWAN (ReachableViaWWAN) eller WiFi (ReachableViaWiFi) uten å være koblet til internett selv når du prøver å nå noen vert som google.com eller apple.com (kanskje en caching utgave). Jeg endte opp med å kalle min egen server og får tilbake et tall - den beste løsningen i mitt tilfelle minst.

Svarte 18/05/2011 kl. 10:40
kilden bruker

stemmer
2

Hva er din nåværende tilkoblingskode ser ut? Hvis du bruker NSURLConnection +sendSynchronousRequest:returningResponse:error:, så du trenger bare å passere adressen til en NSError variabel og sjekk at etterpå; med connectionWithRequest:delegate:, bør du gjennomføre -connection:didFailWithError:i delegat.

Svarte 25/01/2009 kl. 15:59
kilden bruker

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