Pregunta

Necesito verificar si una URL (representada por un NSURL) está disponible o devuelve 404. ¿Cuál es la mejor manera de lograrlo?

Preferiría una forma de verificar esto sin un delegado, si es posible. Necesito bloquear la ejecución del programa hasta que sepa si la URL es accesible o no.

¿Fue útil?

Solución

Como ya sabrá, el error general puede capturar con el método didFailWithError:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}

pero para 404 " No encontrado " o 500 "Error de servidor interno" debería poder capturar dentro del método didReceiveResponse:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    if ([response respondsToSelector:@selector(statusCode)])
    {
        int statusCode = [((NSHTTPURLResponse *)response) statusCode];
        if (statusCode == 404)
        {
            [connection cancel];  // stop connecting; no more delegate messages
            NSLog(@"didReceiveResponse statusCode with %i", statusCode);
        }
    }
}

Otros consejos

Necesitaba una solución que tampoco usara un delegado, así que tomé partes del código que se muestra en otras respuestas aquí y creé un método simple que funciona bien en mi caso (y podría ser lo que buscas también) :

    -(BOOL) webFileExists {

        NSString *url = @"http://www.apple.com/somefile.html";

        NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
        NSHTTPURLResponse* response = nil;
        NSError* error = nil;
        [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        NSLog(@"statusCode = %d", [response statusCode]);

        if ([response statusCode] == 404)
            return NO;
        else
            return YES;
     }

Utilicé la respuesta de woodmantech anterior, pero la modifiqué en función de lo que he visto en otras preguntas similares aquí para que no descargue el archivo completo para ver si existe.

Cambié NSURLRequest a NSMutableURLRequest , y agregué:

[request setHTTPMethod:@"HEAD"];

Esto parece funcionar bien. Estoy trabajando en mi primera aplicación, así que todavía no tengo experiencia real. Gracias a todos.

 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
    [request setHTTPMethod:@"HEAD"];
    NSHTTPURLResponse* response = nil;
    NSError* error = nil;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"statusCode = %d", [response statusCode]);

Puede lograr una conexión síncrona llamando:

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Tu hilo se bloqueará hasta que la solicitud se haya realizado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top