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];
});
});
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. –