Controllo per la connettività Internet in Objective C

voti
15

Ho lavorato attraverso l'iPhone Stanford Coding corso e attualmente agganciando nella API di Twitter. Quello che mi piacerebbe fare è gestire con precisione due condizioni di errore: uno per quando il nome utente non è valido, e un altro per quando il dispositivo non è attualmente connesso a Internet. Purtroppo, così com'è, il meglio che posso supporre è se non il ritorno dalle API è nullo o no - che è il caso per entrambe le condizioni.

Quello che sto cercando è una o due righe di codice che può verificare la presenza di una connessione prima di tentare qualsiasi fetch dati remoti. Ho potuto setacciare attraverso la documentazione di Apple ma ho pensato: perché non mettere la questione a voi ragazzi per il mio vantaggio e forse quella degli altri?

Ulteriori informazioni: Utilizzo di Objective-C e l'SDK iPhone in XCode.

È pubblicato 25/01/2009 alle 16:53
fonte dall'utente
In altre lingue...                            


8 risposte

voti
30

Date un'occhiata al codice di esempio di Apple. Il progetto raggiungibilità mostra come rilevare una connessione.

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

Risposto il 25/01/2009 a 17:35
fonte dall'utente

voti
9

Questo codice funziona, ma non sempre crea il risultato desiderato.

Il modo in cui lo stack TCP su iPhone funziona è molto diverso da quello che dovrebbe essere previsto. Con il codice "raggiungibilità", a volte una connessione di rete è presente, ma non verrà rilevato in modo affidabile. Tuttavia, il lancio di MobileSafari poi ritentare per verificare la connettività con il codice di "raggiungibilità" comporterà il risultato corretto.

Il modo in cui ho trovato più efficace nel determinare la connettività di rete è quello di eseguire un controllo NSURLConnection quando l'applicazione carica, in un thread separato. Effettuare una chiamata a un URL che si sa restituirà qualcosa come "Yes" (vale a dire file HTML sul server o qualcosa del genere). Poi controllare per essere sicuri che il risultato restituito è uguale al testo statico. In questo modo, si sa che la pila NSURLConnection sta raggiungendo in modo corretto, in contrasto con il codice "raggiungibilità" che non tutto funziona in modo coerente.

Risposto il 10/05/2009 a 05:45
fonte dall'utente

voti
9

Avrete bisogno di leggere i codici di errore e rispondere nel miglior modo possibile. Ho avuto qualche esperienza con questo in sostanza si può dipendere da quale servizio si interagisce con ma con delicious.com ottengo l'errore -1012 per il cattivo di utente / passwd, che se si guarda in su è

NSURLErrorUserCancelledAuthentication =     -1012,

anche se chiaramente tale formulazione è fuorviante, anche se posso costantemente replicare mettendo in cattiva utente / passwd e ottenere che il codice di errore. Tecnicamente l'iPhone non è mai non è connesso a Internet se non si è in qualche strano regione che ha problemi con la connessione dati. Vedo inoltre v'è un codice di errore

NSURLErrorNotConnectedToInternet =      -1009,

Vorrei passare attraverso NSURLError.h (e ci sono più simile a quella)

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

eccetera...

tutto quello che dovete fare è ottenere un riferimento all'oggetto NSError avete passato in & Check è il codice di errore in questo modo

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

la costante è qualcosa che ho definito nel mio codice sorgente che è essenzialmente -1012

Risposto il 25/01/2009 a 17:31
fonte dall'utente

voti
8

questo funziona per me ed è preso dal progetto sismico xml mela:

- (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;
}
Risposto il 26/03/2009 a 16:18
fonte dall'utente

voti
3

raggiungibilità è classe separata attraverso è possibile accedere al codice

   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:
    {
    }
}
Risposto il 20/08/2013 a 06:40
fonte dall'utente

voti
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
Risposto il 14/08/2012 a 07:40
fonte dall'utente

voti
2

Quando si utilizza raggiungibilità orso di Apple a mente che si possono trovare te stesso di essere collegato tramite WWAN (ReachableViaWWAN) o WiFi (ReachableViaWiFi) senza essere connessi a Internet anche quando si tenta di raggiungere un host come google.com o apple.com (forse un caching problema). Ho finito per chiamare il mio server e tornare una cifra - la migliore soluzione nel mio caso almeno.

Risposto il 18/05/2011 a 11:40
fonte dall'utente

voti
2

Qual è il tuo codice di connessione corrente assomiglia? Se stai usando NSURLConnection +sendSynchronousRequest:returningResponse:error:, allora non vi resta che passare l'indirizzo di una variabile NSError e verificare che da allora in poi; con connectionWithRequest:delegate:, è necessario implementare -connection:didFailWithError:nel delegato.

Risposto il 25/01/2009 a 16:59
fonte dall'utente

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