2012-03-08 4 views
7

Dopo aver letto la risposta per this question ho trovato che utilizzando reachabilityWithHostName non funziona con un URL come questo: mySite.com/service.asmx, c'è comunque di controllare la raggiungibilità contro questo URL utilizzando reachabilityWithHostName o qualsiasi metodo di classe reachability?controllo raggiungibilità contro una pagina specifica di un URL

grazie mille in anticipo.

+1

raggiungibilità è lì solo per controllare se si dispone di accesso a Internet in modo da poter determinare se è necessario avvertire l'utente e di conseguenza utilizzare i dati memorizzati nella cache. Questo fa parte delle linee guida Apple per l'interazione dell'utente. Se si desidera verificare un URL specifico, provare ad accedervi, impostare il timeout in modo che sia molto piccolo e rilevare l'errore. –

risposta

18

La classe Reachability e -reachabilityWithHostname: è progettata per essere un meccanismo rapido e privo di errori per determinare se si dispone di una connettività di rete di base per l'host. Se è necessario verificare che un particolare URL possa essere scaricato, è necessario utilizzare NSURLConnection per recuperare il contenuto dell'URL per verificare che sia veramente disponibile.

A seconda che si bisogno di fare questo in primo piano o sullo sfondo, è possibile utilizzare il semplice-ma-blocking:

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error 

oppure è possibile utilizzare il metodo più complicato di creazione di un oggetto NSURLConnection, la creazione di un delegato per ricevere risposte e attendere che tali risposte a venire in

per il caso semplice:.

NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL]; 
[request setHTTPMethod: @"HEAD"]; 
NSURLResponse *response; 
NSError *error; 
NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; 

Se si riceve indietro un on-nil myData, hai una sorta di connettività. response e error ti diranno che cosa il server ha risposto a te (in caso di risposta e se hai ricevuto un myData non zero) o che tipo di errore si è verificato, nel caso di un myData nullo.

Per il caso non banale, è possibile ottenere una buona guida da Apple Using NSURLConnection.

Se non si desidera interrompere il processo in primo piano, è possibile farlo in due modi diversi. La documentazione di cui sopra fornirà informazioni su come implementare il delegato, ecc. Tuttavia, un'implementazione più semplice sarebbe quella di utilizzare GCD per inviare la richiesta sincrona su un thread in background e quindi inviarti un messaggio sul thread principale una volta terminato.

Qualcosa di simile a questo:

NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL]; 
[request setHTTPMethod: @"HEAD"]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL), ^{ 
     NSURLResponse *response; 
     NSError *error; 
     NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; 
     BOOL reachable; 

     if (myData) { 
      // we are probably reachable, check the response 
      reachable=YES; 
     } else { 
      // we are probably not reachable, check the error: 
      reachable=NO; 
     } 

     // now call ourselves back on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self setReachability: reachable]; 
     }); 
}); 
+0

puoi fornire un semplice esempio di come farlo in background per evitare di appendere l'applicazione? – JAHelia

+0

Ho aggiunto un esempio di utilizzo di GCD per effettuare la richiesta sincrona su una chiamata asincrona al thread in background, restituendo la risposta al thread principale come un messaggio quando viene completato. Spero possa aiutare. – gaige

+0

fantastico! c'è un piccolo errore nel codice precedente, devi impostare raggiungibile = SÌ nella prima istruzione if e in NO nella seconda istruzione if. grazie mille Gaige. – JAHelia

5

Se si desidera verificare la raggiungibilità su un URL (quello utilizzato di solito contro un nome host), eseguire una richiesta HEAD utilizzando un collegamento NSURLC.